Возможна ли перегрузка оператора << для вложенного частного класса? - PullRequest
10 голосов
/ 10 ноября 2011

Как можно перегрузить оператор << для вложенного частного класса, подобного этому? </p>

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

При попытке вне компилятора внешнего класса жалуется на конфиденциальность:

error: ‘class outer::nested’ is private

Ответы [ 2 ]

12 голосов
/ 10 ноября 2011

Вы можете сделать 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)
    };
    //  ...
};
7 голосов
/ 15 ноября 2014

если вы хотите одну и ту же вещь в двух разных файлах (чч, кпп), вам нужно подружиться два раза, как указано ниже:

чч:

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

кпп:

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

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