27四/092
关于 C++ 中模板类(Template Class)在多文件中的问题
最近 C++ 学到模板类了,老师要做一个模板类的题目。
一直以来我们都是保持着类声明和类实现分别写在头文件和 CPP 文件中这个不错的习惯,这次也没有例外,然而这次问题却出来了。
先是在 G++ 中提示:
undefined reference to `Array::Array(int, int const*)'
移到 VC++ 6.0 后又提示:
ex_08_1.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::~Array<int>(void)" (??1?$Array@H@@QAE@XZ)ex_08_1.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::Array<int>(int,int const *)" (??0?$Array@H@@QAE@HPBH@Z)
到底是怎么回事呢?老师说是编译器的 BUG,我却觉得没那么简单。 汗一个……VC++ 上更不用说了……
搜索了一下,才发现,C++ 中模板类(或者叫“类模板”)的声明和实现和普通类是不同的,模板类的声明有两种模式:包含编译模式和分离编译模式。
包含编译模式就是把声明和实现写在同一个文件中;分离编译模式当然就是写在不同文件中,不过用这种形式的时候,要在类的声明前加上 export 关键字。
我在 G++ 上试了一下,出现:
警告:关键字‘export’未实现,将被忽略
C++ 真是个复杂的东西,还是写在一个文件里吧……
原创文章,转载请注明: 转载自K.I.S.S. - 简单哲学

你可能对这些感兴趣:

2010年10月16日 18:44
模板是不可以放在 h 文件里的,它是 implementation,不是 declaration
2011年04月14日 15:05
准则: C++中的模板类与模板函数都被当作声明(declaration)处理
因为定义一个模板类或模板函数并不能产生实际的代码. 例如
template
void fft_solve(numeric_type *rdata, numeric_type *idata)
{
……//implementations
}
此时编译器并不会为其产生任何代码.
而如果你使用了他: double a[...] = {……}, b[...] = {……}; fft_solve(a,b);
编译器会自动为你产生fft_solve(double *rdata, double *idata).
按照这种处理方法, 把模板函数写入.cpp中, 这个cpp文件也不会作为一个独立的编译单元产生出任何代码. 因为你在别的cpp中使用它, 以这个cpp的眼光看来他对”里面的模板函数被调用”一无所知(不同的cpp作为独立的编译单元处理, 只有链接时才产生关联).