与友元运算符的接口<<:为什么不能link?
Interface with friend operator<<: why can't it link?
我已经为可以使用 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)
在所有派生类中,我已经处理了not re-defining/declaring运算符。解决我的问题的唯一方法是在 ICliObject.h
中内联运算符。 这是怎么回事?
注意:我在 Ubuntu 上使用 GCC。
这与 friend
或 operator<<
或继承无关。
就像在命名空间范围内定义的 any 函数(或对象)一样,如果您在程序中多次这样做(包括将它放在头文件中,您 #include
在多个翻译单元中),你会得到这个错误。
而且,就像在所有其他情况下一样,解决方案是要么将实现移至 "source file",要么在其上粘贴 inline
关键字(您已经建议过,但字面意思是解决方案所以我不知道为什么它不可接受)。
我已经为可以使用 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)
在所有派生类中,我已经处理了not re-defining/declaring运算符。解决我的问题的唯一方法是在 ICliObject.h
中内联运算符。 这是怎么回事?
注意:我在 Ubuntu 上使用 GCC。
这与 friend
或 operator<<
或继承无关。
就像在命名空间范围内定义的 any 函数(或对象)一样,如果您在程序中多次这样做(包括将它放在头文件中,您 #include
在多个翻译单元中),你会得到这个错误。
而且,就像在所有其他情况下一样,解决方案是要么将实现移至 "source file",要么在其上粘贴 inline
关键字(您已经建议过,但字面意思是解决方案所以我不知道为什么它不可接受)。