gpt4 book ai didi

c++ - 与 friend 运营商的接口(interface)<< : why can't it link?

转载 作者:行者123 更新时间:2023-11-27 23:53:26 25 4
gpt4 key购买 nike

我已经为可以使用 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;
}

当我从该接口(interface)继承并尝试构建时,编译工作正常但出现以下链接错误:In blablabla.cpp: multiple definition of operator<<(std::ostream& p_stream, const ICliObject& p_cliUiObject)

在所有派生类中,我都注意不要重新定义/声明运算符。解决问题的唯一方法是在 ICliObject.h 中内联运算符. 发生了什么事?

注意:我在 Ubuntu 上使用 GCC。

最佳答案

这与friend无关或 operator<<或继承。

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

而且,就像在所有其他情况下一样,解决方案是将实现移至“源文件”,或者保留 inline关键字(您已经建议过,但它确实是解决方案,所以我不知道为什么它 Not Acceptable )。

关于c++ - 与 friend 运营商的接口(interface)<< : why can't it link?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44446586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com