有以下模板类的声明和实现:
声明部分:
实现部分:
习惯错误使用方法:
以上代码编译通过,但是连接出现以下错误:
--------------------Configuration: DataSourceConsole - Win32 Debug--------------------
Linking...
Test.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall MiniVector<int>::~MiniVector<int>(void)" (??1?$MiniVector@H@@UAE@XZ)
Test.obj : error LNK2001: unresolved external symbol "public: __thiscall MiniVector<int>::MiniVector<int>(int)" (??0?$MiniVector@H@@QAE@H@Z)
Debug/DataSourceConsole.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
Creating browse info file...
DataSourceConsole.exe - 3 error(s), 0 warning(s)
正确使用方法:
------------------------------------------以下内容转自别人博客------------------------------------------------------
小结:
1.在使用以.h,.cpp分离实现模板类时,不能像使用普通类一样只简单的包涵.h头文件,应该在使用模板类的cpp文件中引入模板类相应的cpp文件
2.将模板类的声明与实现都放在.h中(在多个cpp中使用不同模板参数时可能会引起重复定义的编译错误)
1.在使用以.h,.cpp分离实现模板类时,不能像使用普通类一样只简单的包涵.h头文件,应该在使用模板类的cpp文件中引入模板类相应的cpp文件
2.将模板类的声明与实现都放在.h中(在多个cpp中使用不同模板参数时可能会引起重复定义的编译错误)
模板类的定义和实现必须放在同一文件,
《c++编程思想》中说:模板类定义很特殊,由template<...>定义的任何东西都意味着编译器在当时不为它分配内存空间,它一直处于等待状态,直到被一个模板实例告知,即模板参数是由编译器来替换的。
为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。有时,也可能为了满足特殊需要而要在独立的cpp中放置模板的实现。但大部分现在的编译器还不支持模板类的定义和实现分开
模板类的定义和实现必须放在同一文件,
《c++编程思想》中说:模板类定义很特殊,由template<...>定义的任何东西都意味着编译器在当时不为它分配内存空间,它一直处于等待状态,直到被一个模板实例告知,即模板参数是由编译器来替换的。
为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。有时,也可能为了满足特殊需要而要在独立的cpp中放置模板的实现。但大部分现在的编译器还不支持模板类的定义和实现分开
应该为:类模板的声明和实现一定要放在一起。所谓的放在一起是指在同一文件中,或通过#include包含后,在同一文件中。
原因是模板的实例化,必须满足两个条件:
1。必须知道定义
2。必须知道类型参数
如果定义和声明不在同一文件中,则当使用时,因为没有定义会产生一个指向定义的引用,而在分析定义时,因为不知道类型参数,所以无法实例化。会产生链接错误。
应该为:类模板的声明和实现一定要放在一起。所谓的放在一起是指在同一文件中,或通过#include包含后,在同一文件中。
原因是模板的实例化,必须满足两个条件:
1。必须知道定义
2。必须知道类型参数
如果定义和声明不在同一文件中,则当使用时,因为没有定义会产生一个指向定义的引用,而在分析定义时,因为不知道类型参数,所以无法实例化。会产生链接错误。
模板是编译期的技术,编译完成后模板类必须确定它的模板参数类型,当把Test类的实现部分放在一个独立的.cpp文件中,在编译完成后跟连接之前,Test类的模板参数仍然没有确定,所以报错!汗,这一点让我对模板多少有点失望!
模板是编译期的技术,编译完成后模板类必须确定它的模板参数类型,当把Test类的实现部分放在一个独立的.cpp文件中,在编译完成后跟连接之前,Test类的模板参数仍然没有确定,所以报错!汗,这一点让我对模板多少有点失望!
类模板定义能够声明和实现分开吗
推荐解答:
template 机制称为 compile-time 多态 编译器在编译你的源文件时,若发现
keword template 会马上区找它的实现代码(想想c++怎么样找到它的source code?) 因此 大部分c++代码会把它的 template 实现代码 写在 头文件里
如果你想隐藏你的实现 可以考虑一下指针(本人不确定 这或许不行 本人以前没想过(很惭愧 没你善于考虑问题)),本人从楼上老兄那里得到了些灵感 待本人回家想想
类模板定义能够声明和实现分开吗
推荐解答:
template 机制称为 compile-time 多态 编译器在编译你的源文件时,若发现
keword template 会马上区找它的实现代码(想想c++怎么样找到它的source code?) 因此 大部分c++代码会把它的 template 实现代码 写在 头文件里
如果你想隐藏你的实现 可以考虑一下指针(本人不确定 这或许不行 本人以前没想过(很惭愧 没你善于考虑问题)),本人从楼上老兄那里得到了些灵感 待本人回家想想
是的。
如果把模板实现和定义分开,在模板类所在的编译单元里当然就不可能知道模板参数将是什么——int?char?甚至是用户自定义数据?——模板函数/类也就无从展开。很显然,相应的.o文件也就不可能包含所有这些实例代码。
只有把模板定义放到每一个引用它的地方,这样才可能完成展开——从这个意义上说,所谓模板定义其实应该算是模板声明,真正的定义是在你确认了模板类型参数之后(由编译器自动生成代码)。
不过,即便如此,为了避免和传统的.h .c使用习惯混淆,模板类所在的文件一般还是会用无扩展名或*.inc的格式命名。
是的。
如果把模板实现和定义分开,在模板类所在的编译单元里当然就不可能知道模板参数将是什么——int?char?甚至是用户自定义数据?——模板函数/类也就无从展开。很显然,相应的.o文件也就不可能包含所有这些实例代码。
只有把模板定义放到每一个引用它的地方,这样才可能完成展开——从这个意义上说,所谓模板定义其实应该算是模板声明,真正的定义是在你确认了模板类型参数之后(由编译器自动生成代码)。
不过,即便如此,为了避免和传统的.h .c使用习惯混淆,模板类所在的文件一般还是会用无扩展名或*.inc的格式命名。
模板的实例化是在编译器进行的!