Jul 20
才知道原来在多文件编译时 c++ 类模板的声明和定义一定包含在同一个文件里。
以前写 Game of Life 的时候写了一个动态二维数组的模板,当时的文件是这样包含的:
// matrix.hpp template<class T> class TMatrix { // Declarations… }; #include “matrix.cpp” // Definitions
今天又用到了这个类,看这个文件包含不爽,改成了常规的
// matrix.hpp
template<class T> class TMatrix
{
// Declarations...
};
// matrix.cpp #include "matrix.cpp" ... // Definitions
然后在主程序里引用了一个成员函数
// main.cpp
#include "matrix.hpp"
int main()
{
TMatrix<int> Matrix;
Matrix.row();
return 0;
}
编译:g++ -g main.cpp matrix.cpp
呜呼!出错了!说 TMatrix<int>::row() 只是声明了,没有定义。把 matrix 里的文件包含改成原来那个样子,然后只编译 main.cpp 就没问题了。百思不得其解,后来在 CSDN 上找到了这个。理论上,只要在模板声明前加上 export 关键字,然后用常规的多文件编译方法就可以,但是目前大部分编译器都不支持这个关键字。g++ 说“目前尚未实现,忽略”,真够直接的…

七月 20th, 2007 at 05:51
export这个关键字,其实聊胜于无……基本上模板类必须要把实现也放在头文件里,好像STL就是这样的,因为每次模板实例化的时候都必须知道其定义。我想除非C++引入新的中间目标代码格式,这个问题没有办法解决
十一月 11th, 2007 at 04:48
在C++6.0下是可以的,只要在前面添加包含.cpp就能编译通过
十一月 15th, 2007 at 04:06
C++ 6.0是什么东东?你说的不是VC++ 6.0吧?
如果包含了cpp,那就失去了export的本意了,export本来是要接口实现分离。