posts - 3, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C++模板类与LNK2005

Posted on 2012-05-25 13:40 赵氏呱呱儿 阅读(886) 评论(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() 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文件中。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理