ostream运算符重载的链接器错误(VC ++ 2013)

时间:2016-05-03 02:47:34

标签: c++ visual-c++ dll dllimport ostream

我在(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;没有生成重载,或者正在生成但未正确找到。我确信这很简单,但我一直在敲打这个。

1 个答案:

答案 0 :(得分:1)

由于上面的输入,确定解决方案是在实现中明确指定命名空间(而不是定义):

std::ostream& messaging::operator<< (std::ostream& os, const ComplexMessage& rhs);

请注意,使用命名空间消息传递&#34;条款没有效果;链接器要求在实现声明中明确指定。