写了一个小程序,发现自己的一个知识点漏洞。比如说要写一个class C,通常我会写三个文件:C.h,C.cpp,main.cpp。这样写,一般没什么问题。可是,如果使用了类属机制,比如说在C.h中这样写:
template <class E>
class C
{
public:
C();
......
};
然后在main.cpp中这样写:
C<int> c;
那么,问题就出来了!你build的时候会提示:undefined reference to C<int>::C().
ok,原因在于类属类不能像普通类一样把类界面和类实现组织在不同文件模块中。高等教育出版社的《面向对象程序设计基础》给出了详细解释:由于C++语言的类属机制目前尚未形成统一的标准,不同的C++语言编译程序采用了不同的实现策略。诸如Microsoft Visual C++或Borland C++等编译程序都不允许在定义类属类的文件模块之外创建类属类的实例,编译程序并不为类属类的定义生成任何代码,仅当类属类实例化时才产生真正的代码。由于未实例化的类属类定义没有加入目标文件(.OBJ)中,当建立的可重用类库(.LIB)中包含类属类时会出现程序链接错误。这意味着带有模板的类必须拥有源程序才可重用,所以将类属类的界面与实现放在同一个文件模块中。