首页 文章

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

提问于
浏览
0

我在(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的程序无法链接<<的方法 .

它声明 << 重载为

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

代码编译得很好 . 但它不会链接:

错误LNK2001:未解析的外部符号“declspec(dllimport)类std :: basic_ostream>& cdecl messaging :: operator <<(class std :: basic_ostream>&,class messaging :: ComplexMessage const&)”

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

编辑这与建议的重复问题不同 . 符号在DLL的代码中定义并进行语法编译;但是,它没有链接 . 这告诉我,该特定运算符<< overload的代码未生成,或者正在生成但未正确找到 . 我确信这很简单,但我一直在敲打这个 .

1 回答

  • 1

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

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

    请注意,使用“using namespace messaging”子句无效;链接器要求在实现声明中明确指定 .

相关问题