C++模板类使用问题

有以下模板类的声明和实现:

声明部分:

 

实现部分:

 

习惯错误使用方法:

以上代码编译通过,但是连接出现以下错误:

--------------------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的格式命名。 

 

模板的实例化是在编译器进行的!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值