【问题标题】:Interface with friend operator<<: why can't it link?与好友运算符的接口<<:为什么不能链接?
【发布时间】:2017-06-08 22:32:02
【问题描述】:

我为可以使用operator&lt;&lt; 以文本模式表示的对象创建了一个小接口,如下所示:

// 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&lt;&lt;(std::ostream&amp; p_stream, const ICliObject&amp; p_cliUiObject)

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

注意:我在 Ubuntu 上使用 GCC。

【问题讨论】:

  • 要么用inline关键字标记头部的函数定义,要么将其移动到某个源文件。
  • 需要在函数定义中添加inline
  • 复制您的链接器错误并在 SO 中搜索它。您可能会发现关于该主题的一个或多个问题。
  • 我有,但大多数人忘记了不要重新定义/声明。另外,我找到了内联解决方案,我只是想知道为什么这里需要它。谢谢
  • 告诉链接器不要抱怨在多个翻译单元中定义了相同的符号是inline关键字存在的原因。

标签: c++ friend-function linker-errors


【解决方案1】:

这与friendoperator&lt;&lt; 或继承无关。

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

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

【讨论】:

  • 另一种可能的解决方案是在类定义中定义函数(因为这使得它隐含inline
  • 所以我为operator&lt;&lt;在类外添加的定义(但在同一个头文件中)使它在整个程序中定义了多次,这导致了链接错误。我明白了,谢谢。
猜你喜欢
  • 2011-01-03
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 2016-03-01
  • 1970-01-01
  • 2012-01-21
相关资源
最近更新 更多