vector相关的模板类函数声明与实现

来源:互联网 发布:opencv 灰度共生矩阵 编辑:程序博客网 时间:2024/05/01 10:59

为什么超链接我不会用,直接上我的smart_STL的地址:
https://github.com/markjenny/Smart_STL 希望大家和我多多讨论,轮子还在建造的初期。
在造stl的轮子时候,我起初对于stl总体结构式停留在基本的编程方法中,即函数的声明在头文件.h中,函数的实现在源文件.cpp中。并且认为这样也不错,但是唯一感到不好的就是以后我将这个轮子打包成库的时候应该不是很方便吧。
但是让我真正意识到stl中不能出现.cpp而只能有.h文件的是今天的主角——模板类函数的声明与实现。
当我在写vector的构造函数和析构函数时,我将默认构造函数在类声明中直接写成:

vector():start_(0), finish_(0), end_of_storage(0){}

main.cpp定义如下:

#include <iostream>#include "smart_vector.h"int main(){    smart_stl::vector<int> a;    std::cout << a.end() << std::endl;    return 0;}

在最后的main函数中调用是没有出现问题,但是在写vector的析构函数时,我将~vector()放在smart_vector.h中进行声明,但是我在smart_cpp对~vector()来进行定义。此时在链接出现了问题,在main.cpp函数中不识别~vecotr()这个外部符号,但是我已经将函数的定义放在了smart_vector.cpp中为什么还是不识别这个外部符号呢?
原因是vector中的模板函数还是模板函数,它并没有被实例化!!!
下面我稍微仔细地解释一下这个过程:当我们在main.cpp中用类型int对这个vector进行实例化时,由于在头文件中#include “smart_vector.h”,编译器会去产找相关函数。因为需要析构对象a,所以就要调用~vector()函数,但是在smart_vector.h中编译器找不到函数的定义,但此时编译器认为其他文件中应该有~vector()的定义。所以就把这个问题留给了链接过程。

而现在编译smart_vector.cpp的时候,编译器只对smart_vector进行语法和语义的相关检查,并编译成可重定向的目标文件(.o或是window中的.obj),这个过程中并没有对~vector()进行实例化,因为并没有参数传入到smart_vector.cpp中,所以编译器没有办法给a中需要的虚构函数~vector()声明相关的代码。这样在链接过程中,编译器在其他文件中都找不到a对象所需要的析构函数~vector()的定义,故在链接过程中无法解析这个外部符号。

解决的办法目前认为有两种:
一、将关于函数定义的代码全部放在.h中,在main.cpp中实例化是要让编译器看到实例化参数,这样编译器就可以根据int参数来找到模板类函数的声明和定义,就可以实例化该函数,就不会出现链接错误;
二、该方法和核心思想也是在实例化时看到模板类函数的定义,即是在main.cpp中#include “smart_vector.cpp”,这样也不会出现链接错误。
上述两点的核心思想都是:在实例化参数的时候,编译器可以看到模板类的声明和定义!!!

0 0
原创粉丝点击