为什么在使用模板时会出现“无法parsing的外部符号”错误?

当我使用模板为一个类编写C ++代码,并在源(CPP)文件和头文件(H)之间拆分代码时,在链接最后的可执行文件时,会出现大量“无法parsing的外部符号”尽pipe目标文件被正确构build并包含在链接中。 这里发生了什么,我该如何解决?

模板化类和函数在使用之前不会被实例化,通常在单独的.cpp文件(例如程序源)中。 当使用模板时,编译器需要该函数的完整代码才能使用适当的types构build正确的函数。 但是,在这种情况下,该函数的代码在模板的源文件中详细说明,因此不可用。

作为这一切的结果,编译器只是假定它是在其他地方定义的,只是将调用插入到模板化函数中。 当编译模板的源文件时,程序源中使用的特定模板types将不会被使用,因此它将不会生成该函数所需的代码。 这会导致无法parsing的外部符号。

可用的解决scheme是:

  1. 在模板的头文件中包含成员函数的完整定义,并且没有模板的源文件,
  2. 定义模板源文件中的所有成员函数为“inline”,或者
  3. 使用“export”关键字定义模板源中的成员函数。 不幸的是,这不是很多编译器支持。 (更新: 从C ++ 11开始已经从标准中删除了 。)

1和2基本上都是通过在编译器访问程序源中的types化函数时访问模板化函数的完整代码来解决问题的。

另一个select是把代码放在cpp文件中,并在同一个cpp文件中添加你希望使用的模板的显式实例。 如果您知道您只是将其用于您事先知道的几种types,那么这非常有用。

对于包含.h文件的每个文件,您应该插入两行:

 #include "MyfileWithTemplatesDeclaration.h" #include "MyfileWithTemplatesDefinition.cpp" 

样品

 #include "list.h" #include "list.cpp" //<---for to fix bug link err 2019 int main(int argc, _TCHAR* argv[]) { list<int> my_list; my_list.add_end(3); . . } 

另外,你不要忘记把你的声明类放在centinel常量中

 #ifndef LIST_H #define LIST_H #include <iostream> . . template <class T> class list { private: int m_size, m_count_nodes; T m_line; node<T> *m_head; public: list(void); ~list(void); void add_end(T); void print(); }; #endif