Posted on 2012-05-25 13:40
赵氏呱呱儿 阅读(898)
评论(0) 编辑 收藏 引用
目前大部分的编译器都不支持C++模板类的声明与定义分离编译,因此模板类的声明和定义都要在同一个头文件中给出。
//----1.h-----//
#pragma once
template<typename _T>
class A
{
public:
A():a(_T(0)),b(_T(0)){}
A(_T ta,_T tb):a(ta),b(tb){}
~A(){}
public:
const _T sum() const{ return a+b; };
private:
_T a;
_T b;
};
//顶层函数
template<typename _T>
A<_T> operator + (const A<_T> &al,const A<_T> &ar)
{
A<_T> ta(al.sum(),ar.sum());
return ta;
}
如果将声明放在1.h,定义放在1.cpp,如果按照正常的编程方式,在mian.cpp中加入#include "1.h",则编译会出现如下错误:
1>main.obj : error LNK2019: 无法解析的外部符号 "class A<int> __cdecl operator+<int>(class A<int> const &,class A<int> const &)" (??$?HH@@YA?AV?$A@H@@ABV0@0@Z),该符号在函数 _main 中被引用
1>E:\C++\test\Debug\test.exe : fatal error LNK1120: 1 个无法解析的外部命令
//-----------------分割线-------------------//
如果在1.h头文件中出现了非模板函数,譬如说
//-------1.h---------//A<double> operator + (const A<double> &al,const A<int> &ar)
{
A<double> ta(al.sum(),(double)(ar.sum()));
return ta;
}
那么这个非模板函数最好声明和定义分离,即将非模板函数定义写在1.cpp中,否则在多个CPP文件同时包含1.cpp时会出现LN2005错误:
1>1.obj : error LNK2005: "class A<double> __cdecl operator+(class A<double> const &,class A<int> const &)" (??H@YA?AV?$A@N@@ABV0@ABV?$A@H@@@Z) 已经在 main.obj 中定义
1>E:\C++\test\Debug\test.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
//-----------------分割线------------------//
总结:模板类的声明和定义在同一个头文件中,非模板类或函数的声明和定义分别写在头文件和cpp文件中。