C++模板类与LNK2005

目前大部分的编译器都不支持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()  constreturn 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< doubleoperator + ( 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文件中。

你可能感兴趣的:(C++模板类与LNK2005)