是否有可能以任何方式提供一个流运算符作为类中的内联(即非友元)?

Joh*_*0te 2 c++ operator-overloading

首先,我想指出,我确实阅读了{此处提供的解决方案},其中指出:

请注意,输出流运算符通常不是成员函数。(这是因为二元运算符要成为成员函数,它们必须是其左侧参数类型的成员。但是,这是一个流,而不是您自己的类型。有一些重载的情况除外:operator<<()一些内置函数,它们是输出流类的成员。)

现在,这是我的问题。我正在从大型应用程序中删除库。该库应该将任何有用的功能压缩到一个头文件中。

此头文件中的类之一需要具有流 << 运算符重载。我无法弄清楚如何在没有友元函数的情况下执行此操作,并且如果我使用友元函数,我无法在标头中完成所有操作,因为我会收到多个定义错误。

那么,有没有什么技巧——也许有些技巧可以使用函子、包装器或其他什么东西,这将允许我在我的类中为 << 的运算符重载编写一个定义来避免这个问题?

ild*_*arn 5

class SomeClass
{
    friend std::ostream& operator <<(std::ostream& os, SomeClass const& sc)
    {
        // impl
        return os;
    }
};
Run Code Online (Sandbox Code Playgroud)

类定义内部内联提供的函数定义是隐式标记的inline,因此不会导致多重定义链接器错误。

或者,您可以提供外联定义并显式标记它inline,再次避免多重定义链接器错误:

class SomeClass
{
    // unnecessary if operator<< doesn't need access to non-public members
    friend std::ostream& operator <<(std::ostream&, SomeClass const&);
};

inline std::ostream& operator <<(std::ostream& os, SomeClass const& sc)
{
    // impl
    return os;
}
Run Code Online (Sandbox Code Playgroud)