【问题标题】:Linker Error for ostream operator overload (VC++ 2013)ostream 运算符重载的链接器错误 (VC++ 2013)
【发布时间】:2016-05-03 02:47:33
【问题描述】:

我在 (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 > & __cdecl 消息传递::操作符 &,类消息传递::ComplexMessage const &)"

所有其他 DLL 方法链接正常。有谁知道为什么会发生此链接器错误?

编辑 这与建议的重复问题不同。符号在 DLL 的代码中定义并在语法上编译;但是,它没有链接。这向我表明,要么没有生成特定 operator

【问题讨论】:

  • 如果您在两个位置都指定了未命名的命名空间::operator&lt;&lt;,可能会发现一些问题。我见过的一个问题是命名空间中的原型,以及另一个/无中的定义。这不会产生编译错误。 (不过可能会发出警告。您是否筛选了所有警告?)需要明确的是,这不会解决问题,但可能有助于诊断。
  • 使用 .h 文件来声明导出的函数。这样您就不会意外使用错误的命名空间名称。水晶球说在messaging中没有定义。
  • 答案确实是命名空间,而不是类标识符。前缀“消息:;”给运营商(“messaging::operator

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


【解决方案1】:

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

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

请注意,“使用命名空间消息传递”子句无效;链接器要求在实现声明中明确指定。

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2014-04-24
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多