有人可以告诉我以下错误意味着什么吗?
错误2错误LNK2019:未解决 外部符号“公共:阶级 TLst& __thiscall TLST ::运算符=(类 TLst const&)“ (?? 4?$ @ TLST @@@@ VTInt @ QAEAAV0 @@ ABV0 Z) 在函数“public:void中引用 __thiscall TPair> :: GetVal(类TInt &,类TLst&)const“ (?GetVal @?$ TPair @ VTInt @@ V?$ TLst @ VTInt @@@@@@ QBEXAAVTInt @@ AAV?$ TLst @ VTInt @@@@@ Z)randomgraph.obj randomgraph
答案 0 :(得分:4)
通常,这意味着链接器会看到对符号的引用,但它无法在任何地方找到它 - 通常是由于缺少库或目标文件。
在这种情况下,这是因为您在.cpp文件中实现了模板化的类成员函数 - 它们应该在标题中实现。
模板类是模板而不是类。当编译器看到你使用例如vector<int> f;
它会从模板vector<int>
创建一个新类vector
。为了创造例如vector<int>::size()
它需要在模板实例化时看到size()
的实现 - 如果size()
的实现不在头文件中,它就不能这样做。
您可以通过为vector
显式实例化int
来解决这个问题 - 然后编译器在编译cpp文件时会看到显式实例化。这违背了拥有模板的目的 - 它只能用于您通过显式实例化预定义的类型。所以,简短的故事,总是在头文件中完全实现模板。
答案 1 :(得分:1)
Unresolved external symbol
表示链接器找不到引用。这通常是由于忘记将链接文件或库添加到链接步骤而导致的。 (包括类的头文件是不够的 - 您还必须添加实现代码。)
答案 2 :(得分:0)
此问题已解决。在模板类TLst中,函数
TLst TLst :: operator =(const TLst&amp;);
已宣布,但未定义。
我必须在.cpp文件中定义该函数。我也可以在我的头文件中定义它。
感谢您的回复。
索姆纳特