2011-02-18 71 views
0
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall MyList<class Event>::~MyList<class Event>(void)" ([email protected]@@@@[email protected]) referenced in function _main 

任何想法可能会出错?我有一个工作课,然后我试图模板,我得到上述错误。任何想法 ?我有点迷路。编译代码时出错尝试将类转为模板

而且在主我用这个:

MyList<Event> eventManager; 
+0

请给我们原始的课程代码和模板代码。 – 2011-02-18 23:44:09

回答

2

模板与C++的编译模型奇怪地玩,因为它们不是可执行代码 - 它们是用于可执行代码的模板。因此,将类分区为.h/.cpp对的标准模型对于模板无法正确运行。

原因是您通常会将具有接口和.cpp文件的类拆分为具有实现的.h文件,因为通常可以在引用其他.cpp文件中定义的代码时单独编译.cpp文件,因为编译完文件后,链接器会将所有引用修补到一起。由于所有.cpp都编译成包含可执行代码的目标文件,因此所有内容都可以正确运行。

但是,使用模板会导致系统崩溃。如果您定义了一个模板类,然后将其成员函数的所有实现放入.cpp文件中,那么当编译器编译该文件时,它将找不到任何代码 - 只需模板代码,因此它不会为模板方法生成任何目标代码。因此,在链接时,由于没有可用的代码,因此您将尝试调用模板类的每个成员函数都会出错。

我不确定这是什么原因导致了你的特定错误,但是从你描述的情况来看,这看起来就是这种情况,特别是因为你改变了一个非模板类。 h/.cpp对)转换为模板类。

要解决这个问题,传统的C++解决方案只是为没有附带源文件的模板提供一个.h文件。只需将源文件中的所有代码移动到标题中即可。我喜欢把一个行头标记的界面停止和地方开始实施,往往像

/* * * * * Implementation Below This Point * * * * */ 

/* * * * * Here be Dragons * * * * */ 

为了使点更清楚一点。

希望这会有所帮助!

0

你最有可能把你的函数的实现(在这种情况下,析构)成.cpp文件。这是行不通的。当与模板一起使用时,任何人都可以访问完整的函数体,所以你通常会把它放到.h文件中。