您的位置:首页 > 编程语言 > C语言/C++

c++使用类模板时,类定义声明分离,vc编译报错

2013-03-30 17:22 323 查看
转自 http://www.cnblogs.com/review/articles/2706891.html 点击打开链接


C++模板类的包含模式和分离模式

C++模板函数和模板类,如果分别在.h头文件中声明,在.cpp源文件中定义。如果没有调用该模板,编译可以通过,但是一旦调用到该模板,编译时就容易报错。这与模板的编译模式有关
C++支持两种模板编译模式:包含模式Inclusion Model 和分离模式 Separation Model
以下为C++Prime中内容:
包含编译模式:
"在包含编译模式下我们在每个模板被实例化的文件中包含函数模板的定义并且往往把定义放在头文件中像对内联函数所做的那样"
分离编译模式:
"在分离编译模式下函数模板的声明被放在头文件中"
"在模板定义中有一个关键字export", "关键字export 告诉编译器在生成被其他文件使用的函数模板实例时可能需要这个模板定义编译器必须保证在生成这些实例时该模板定义是可见的"

"关键字export 不需要出现在头文件的模板声明中"
"分离模式使我们能够很好地将函数模板的接口同其实现分开进而组织好程序以便把函数模板的接口放到头文件中而把实现放在文本文件中但是并不是所有的 编译器都支持分离模式即使支持也未必总能支持得很好支持分离模式需要更复杂的程序设计环境所以它们不能在所有C++编译器实现中提供"
很遗憾,目前VC、VS的任何版本皆不支持分离模式!
大部分编译器在编译模板时都使用包含模式
也就是一般使用的把模板放到头文件中在包含
当你不使用这个模版函数或模版类,编译器并不实例化它 ,当你使用时,编译器需要实例化它,
因为编译器是一次只能处理一个编译单元, 也就是一次处理一个cpp文件,所以实例化时需要看到该模板的完整定义 . 所以都放在头文件中
这不同于普通的函数, 在使用普通的函数时,编译时只需看到该函数的声明即可编译, 而在链接时由链接器来确定该函数的实体
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: