我为可以使用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。

最佳答案

这与friendoperator<<或继承无关。

像在命名空间范围内定义的任何函数(或对象)一样,如果您在程序中多次执行此操作(包括通过在多个转换单元中的#include头文件中包含该函数),将收到此错误。

并且,像在所有其他情况下一样,解决方案是将实现移至“源文件”,或在其上贴上inline关键字(您已经建议过,但这实际上是解决方案,所以我不知道为什么它不被接受)。

09-07 06:45