K.I.S.S. – 简单哲学 Linux, Freedom, Arch, Python, Gtk+, C … Keep It Simple, Stupid!

27四/092

关于 C++ 中模板类(Template Class)在多文件中的问题

最近 ++ 学到模板类了,老师要做一个模板类的题目。
一直以来我们都是保持着类声明和类实现分别写在头文件和 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,我却觉得没那么简单。
搜索了一下,才发现,C++ 中模板类(或者叫“类模板”)的声明和实现和普通类是不同的,模板类的声明有两种模式:包含编译模式和分离编译模式。
包含编译模式就是把声明和实现写在同一个文件中;分离编译模式当然就是写在不同文件中,不过用这种形式的时候,要在类的声明前加上 export 关键字。
我在 G++ 上试了一下,出现:

警告:关键字‘export’未实现,将被忽略

汗一个……VC++ 上更不用说了……
C++ 真是个复杂的东西,还是写在一个文件里吧……

原创文章,转载请注明: 转载自K.I.S.S. - 简单哲学

本文链接地址: 关于 C++ 中模板类(Template Class)在多文件中的问题

分享家:Addthis中国

你可能对这些感兴趣:

  1. C++ 中出现“不能将成员函数声明为有静态链接“的解决方法
  2. 人生苦短,我用 Genie

喜欢这个文章吗?

考虑订阅我们的RSS Feed吧!

标签: 发表评论
评论 (2) 引用 (0)
  1. 模板是不可以放在 h 文件里的,它是 implementation,不是 declaration

  2. 准则: 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作为独立的编译单元处理, 只有链接时才产生关联).


Leave a comment

(required)

还没有引用.