我在(VC ++ 2013)DLL中定义的<<
运算符重载编译正常:
定义:
__declspec(dllexport) friend std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs);
实现:
std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs)
{
os << rhs.toString();
return(os);
}
dll包含另外50个方法,包括多个运算符重载,可以编译和链接。
但是,使用dll的程序无法链接&lt;&lt;。
的方法它将<<
重载声明为
__declspec(dllimport) std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs);
代码编译得很好。但它不会链接:
错误LNK2001:未解析的外部符号“__declspec(dllimport)类 std :: basic_ostream&gt; &安培; __cdecl messaging :: operator&lt;&lt;(class std :: basic_ostream&gt;&amp;,class messaging :: ComplexMessage const&amp;)“
所有其他DLL方法链接正常。有谁知道为什么会发生这个链接器错误?
EDIT 这与提议的重复问题不同。符号在DLL的代码中定义并进行语法编译;但是,它没有链接。这告诉我,该特定运算符的代码&lt;&lt;没有生成重载,或者正在生成但未正确找到。我确信这很简单,但我一直在敲打这个。
答案 0 :(得分:1)
由于上面的输入,确定解决方案是在实现中明确指定命名空间(而不是定义):
std::ostream& messaging::operator<< (std::ostream& os, const ComplexMessage& rhs);
请注意,使用命名空间消息传递&#34;条款没有效果;链接器要求在实现声明中明确指定。