模板与C++的编译模型奇怪地玩,因为它们不是可执行代码 - 它们是用于可执行代码的模板。因此,将类分区为.h/.cpp对的标准模型对于模板无法正确运行。
原因是您通常会将具有接口和.cpp文件的类拆分为具有实现的.h文件,因为通常可以在引用其他.cpp文件中定义的代码时单独编译.cpp文件,因为编译完文件后,链接器会将所有引用修补到一起。由于所有.cpp都编译成包含可执行代码的目标文件,因此所有内容都可以正确运行。
但是,使用模板会导致系统崩溃。如果您定义了一个模板类,然后将其成员函数的所有实现放入.cpp文件中,那么当编译器编译该文件时,它将找不到任何代码 - 只需模板代码,因此它不会为模板方法生成任何目标代码。因此,在链接时,由于没有可用的代码,因此您将尝试调用模板类的每个成员函数都会出错。
我不确定这是什么原因导致了你的特定错误,但是从你描述的情况来看,这看起来就是这种情况,特别是因为你改变了一个非模板类。 h/.cpp对)转换为模板类。
要解决这个问题,传统的C++解决方案只是为没有附带源文件的模板提供一个.h文件。只需将源文件中的所有代码移动到标题中即可。我喜欢把一个行头标记的界面停止和地方开始实施,往往像
/* * * * * Implementation Below This Point * * * * */
或
/* * * * * Here be Dragons * * * * */
为了使点更清楚一点。
希望这会有所帮助!
请给我们原始的课程代码和模板代码。 – 2011-02-18 23:44:09