链接器工具错误 LNK2019 - 模板类里声明友元函数

错误消息

在函数“function”中引用了无法解析的外部符号“symbol”

 

function 中找到了未定义的外部符号 (symbol)。若要解决此错误,请提供符号定义或移除引用它的代码。一般报错如下:

error LNK2001: unresolved external symbol "class std::basic_ostream > & __cdecl operator<<(class std::basic_ostream > &,class test const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$test@H@@@Z)

 

复制代码 // LNK2019e.cpp // compile with: /EHsc // LNK2019 expected #include using namespace std; template class Test { friend ostream& operator<<(ostream&, Test&); // 注意,将上面一行换作下面任意一行就可以解决此问题。 // 区别在于,在友元函数声明之前添加template 以帮助编译器了解友元函数的类型? // template friend ostream& operator << (ostream&, Test&); //第一种改法 // friend ostream& operator << <>(ostream&, Test&); //第二种改法 // friend ostream& operator << (ostream&, Test&); //第三种改法 }; template ostream& operator<<(ostream& os, Test& tt) { return os; } int main() { Test t; cout << "Test: " << t << endl; // unresolved external }

 

网上看到的一种改法,报error LNK2001: unresolved external symbol的错!因为没有像sun手册中提到的“实际的模板声明必须在友元声明之前”中讲到的“由于operator<<有一个type array的参数(模板类型形参?),因此在声明函数之前,必须声明array

 #include using namespace std; /* 通过和微软MSDN的比较,就可以发现: * 事先在类声明之前声明其中的重载函数是没有用的 */ //声明模板类 template class test; //声明模板类中的重载函数,不过这句话貌似可有可无 template ostream& operator<<(ostream& os, const test& des); template class test{ T x; public: friend ostream& operator<<(ostream& os, const test& des); //改成下面一行就可以了 //friend ostream& operator<< (ostream& os, const test& des); }; template ostream& operator<<(ostream& os, const test& des) { return os << des.x; } int main(int, char* []) { test x; cout << x << endl; //未能解析的外部变量 return 0; };

你可能感兴趣的:(链接器工具错误 LNK2019 - 模板类里声明友元函数)