C++模板类/模板函数的BUG

小弟初学模板编程,多多关照 在Fraction.h中,我是这么定义的
#pragma once  
#ifndef FRACTION
#define FRACTION
template<class T>
class Fraction
{
public:
Fraction(void);
Fraction(T ,T);
~Fraction(void);
private:
T numerator;//分子
T denominator;//分母
};
#endif
在Fraction.cpp中我是这么实现的
#include "StdAfx.h"
#include "Fraction.h"

template<class T>
Fraction<T>::Fraction(void):numerator(0),denominator(0)
{
}

template<class T>
Fraction<T>::Fraction(T numerator,T denominator)
{
this->numerator=numerator;//分子
this->denominator=denominator;//分母
}

template<class T>
Fraction<T>::~Fraction(void)
{
}
主函数调用如下
#include "stdafx.h"  
#include"Fraction.h"

int _tmain(int argc, _TCHAR* argv[])
{
Fraction<int> ftion(10,120);
return 0;
}
提示如下错误
1>One.obj : error LNK2019: unresolved external symbol "public: __thiscall Fraction<int>::~Fraction<int>(void)" (??1?$Fraction@H@@QAE@XZ) referenced in function _wmain  
1>One.obj : error LNK2019: unresolved external symbol "public: __thiscall Fraction<int>::Fraction<int>(int,int)" (??0?$Fraction@H@@QAE@HH@Z) referenced in function _wmain
1>F:\DataStruct\ChapterOne\One\Debug\One.exe : fatal error LNK1120: 2 unresolved externals
1>Build log was saved at "file://f:\DataStruct\ChapterOne\One\One\Debug\BuildLog.htm"
1>One - 3 error(s), 0 warning(s)
我用的是VS2008,请大侠赐教啊
大侠1:
这个是初学者常见问题了。简而言之,目前绝大多数C++编译器不支持将模版类/模版函数的声明与实现分开。所以你要写就全部一起写在头文件中,不要分开写到两个文件中。或者像楼上所说在头文件中再#include一次(不过没啥意义)。这个是C++的一个老顽固问题了,虽然C++标准有规定通过export关键字来实现模版的分离编译,但是因为实现过于复杂,实际上几乎没有编译器鸟它。VC、BC、GCC都不支持。(貌似只有ICC部分支持)所以你也只能向现实妥协了呵呵,就像STL一样,把模版函数和模版类的实现全部写在.h头文件中吧。
大侠2:
两个解决方案:①将Fraction.h和Fraction.cpp文件写到一个文件中,即Fraction.h头文件。②将Fraction.cpp改名为Fraction.template文件,然后再Fraction.h倒数第一行#endif之前加入一行代码 #include "Fraction.template"即可。
大侠3:
主函数里面包含不能包含Fraction.h头文件,要包含Fraction.cpp文件

原文链接: https://www.cnblogs.com/sunchaosailor/archive/2012/03/12/2391307.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++模板类/模板函数的BUG

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/43965

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午8:37
下一篇 2023年2月8日 下午8:38

相关推荐