重载运算符时无法解析的外部

unresolved external when overloading an operator

提问人:Luca 提问时间:3/16/2017 更新时间:3/16/2017 访问量:279

问:

我有一个简单的 C++ 类,如下所示:

class  __declspec(dllexport) PrefData
{
public:
  PrefData();
  int m_data_member;
};

std::ostream& operator<<(std::ostream& os, const PrefData& obj);

这会导致未解析的外部错误和未解析的外部符号。现在,我尝试将其作为类成员:class std::basic_ostream > & __cdecl cop4530::operator<<

class  __declspec(dllexport) PrefData
{
public:
  PrefData();
  int m_data_member;
  friend std::ostream& operator<<(std::ostream& os, const PrefData& obj);
};

这也导致了同样的错误。但是,当我将其导出为:

class  __declspec(dllexport) PrefData
{
public:
  PrefData();
  int m_data_member;
};

__declspec(dllexport) std::ostream& operator<<(std::ostream& os, const PrefData& obj);

这链接很好。我不确定为什么当它是类成员函数时它没有链接,因为它被应用于整个类?其次,导出这个运算符是个坏主意吗?我在某处读到这可能不是一件好事,但我无法弄清楚细节。dllexport

C++ DLL 链接器 运算符重载 未解析的外部

评论

2赞 Some programmer dude 3/16/2017
只是为了澄清一下,第二种选择不会使函数成为成员函数。它仍然是一个非成员函数,但在类的作用域中声明该定义仍然没有(我假设)标记为导出的函数。如果您将函数声明为在类中导出,它可能会起作用。PrefData
0赞 Luca 3/16/2017
谢谢你。我不知道。是否可以将函数声明为导出?我不确定对跨DLL边界的运算符这样做是否有好处。至少我读过一些这方面的东西。

答: 暂无答案