嵌套私有类的operator<<重载是否可行?

17

如何为像以下这样的嵌套私有类重载运算符<<?

class outer {
  private:
    class nested {
       friend ostream& operator<<(ostream& os, const nested& a);
    };
  // ...
};

当尝试在外部类之外使用时,编译器会报隐私问题:

error: ‘class outer::nested’ is private
2个回答

17
你可以将operator<<设为outer的友元函数,或者在nested中完全使用inline实现,例如:
class Outer
{
    class Inner
    {
        friend std::ostream& 
        operator<<( std::ostream& dest, Inner const& obj )
        {
            obj.print( dest );
            return dest;
        }
        //  ...
        //  don't forget to define print (which needn't be inline)
    };
    //  ...
};

打印函数应该是一个常量成员函数。如果是 std::ostream& print(std::ostream &out) const,那么 operator<< 可以只有一行代码:return obj.print(dest); - Nawaz
为什么std::ostream需要成为Inner的友元? - Mordachai
1
因为你不能在Inner中定义它。否则,如果它没有在Inner中定义,你就会遇到一个问题,即它无法访问Inner,因为InnerOuter的私有成员。 - James Kanze
2
@Mordachai - 它基本上是类内的一个内联自由函数定义(即不是成员函数)。那个被声明为友元的不是 std::ostream,而是 operator<<( std::ostream& dest, Inner const& obj )std::ostream & 只是该函数的返回类型。 - Omnifarious

10

如果你想在两个不同的文件(hh、cpp)中使用相同的函数,你需要这样做两次:

hh:

// file.hh
class Outer
{
    class Inner
    {
        friend std::ostream& operator<<( std::ostream& dest, Inner const& obj );
        // ...
    };

    friend std::ostream& operator<<( std::ostream& dest, Outer::Inner const& obj );
    //  ...
};

cpp:

// file.cpp:
#include "file.hh"

std::ostream    &operator<<( std::ostream& dest, Outer::Inner const& obj )
{
    return dest;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接