我为可以使用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。
最佳答案
这与friend
或operator<<
或继承无关。
像在命名空间范围内定义的任何函数(或对象)一样,如果您在程序中多次执行此操作(包括通过在多个转换单元中的#include
头文件中包含该函数),将收到此错误。
并且,像在所有其他情况下一样,解决方案是将实现移至“源文件”,或在其上贴上inline
关键字(您已经建议过,但这实际上是解决方案,所以我不知道为什么它不被接受)。