【发布时间】:2017-06-08 22:32:02
【问题描述】:
我为可以使用operator<< 以文本模式表示的对象创建了一个小接口,如下所示:
// ICliObject.h
class ICliObject
{
public:
~ICliObject() = default;
friend std::ostream& operator<<(std::ostream& p_stream, const ICliObject& p_cliUiObject);
protected:
virtual void print(std::ostream& p_stream) const = 0;
};
std::ostream& operator<<(std::ostream& p_stream, const ICliObject& p_cliUiObject)
{
p_cliUiObject.print(p_stream);
return p_stream;
}
当我从这个接口继承并尝试构建时,编译工作但我得到以下链接错误:In blablabla.cpp: multiple definition of operator<<(std::ostream& p_stream, const ICliObject& p_cliUiObject)
在所有派生类中,我都注意不要重新定义/声明运算符。我可以解决我的问题的唯一方法是在ICliObject.h 中内联运算符。 发生了什么事?
注意:我在 Ubuntu 上使用 GCC。
【问题讨论】:
-
要么用
inline关键字标记头部的函数定义,要么将其移动到某个源文件。 -
需要在函数定义中添加
inline。 -
复制您的链接器错误并在 SO 中搜索它。您可能会发现关于该主题的一个或多个问题。
-
我有,但大多数人忘记了不要重新定义/声明。另外,我找到了内联解决方案,我只是想知道为什么这里需要它。谢谢
-
告诉链接器不要抱怨在多个翻译单元中定义了相同的符号是
inline关键字存在的原因。
标签: c++ friend-function linker-errors