与友元运算符的接口<<:为什么不能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。

这与 friendoperator<< 或继承无关。

就像在命名空间范围内定义的 any 函数(或对象)一样,如果您在程序中多次这样做(包括将它放在头文件中,您 #include 在多个翻译单元中),你会得到这个错误。

而且,就像在所有其他情况下一样,解决方案是要么将实现移至 "source file",要么在其上粘贴 inline 关键字(您已经建议过,但字面意思是解决方案所以我不知道为什么它不可接受)。