重载运算符<<对于嵌套的私有类可能吗?

时间:2011-11-10 15:44:29

标签: c++ nested operator-overloading nested-class

如何重载运算符<<对于像这样的嵌套私有类?

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

当在外部类编译器外面尝试抱怨隐私时:

error: ‘class outer::nested’ is private

2 个答案:

答案 0 :(得分:12)

您也可以operator<<成为outer的朋友。或者您 可以在inline中完全实现nested,例如:

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)
    };
    //  ...
};

答案 1 :(得分:7)

如果你想在两个不同的文件(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;
}