Объявление оператора вставки друга (operator <<) для вложенного перечислимого класса - PullRequest
0 голосов
/ 10 декабря 2018

Для класса с вложенным перечислимым классом, где должен быть объявлен оператор друга для вложенного перечисления.Потому что это друг, он не может быть вне класса.Но нет способа определить оператор друга внутри объявления класса enum в c ++.Итак, должно ли оно быть объявлено внутри класса, в который вложено перечисление?Это работает как для открытых, так и для частных объявлений enum

РЕДАКТИРОВАТЬ: Вопрос в следующем ... является ли класс вмещания правильной областью для объявления функции друга для вложенного перечисления?

#include <iostream>

namespace a::b::c
{

class Test
{
private:
    enum class TestEnumPrivate { v0, v1, v2 };

    friend std::ostream & operator << (std::ostream & os, TestEnumPrivate const v)
    {
        return os << static_cast < int32_t >(v);
    }

public:
    auto value() const
    {
        return TestEnumPrivate::v0;
    }

    enum class TestEnumPublic { v0, v1, v2 };

    friend std::ostream & operator << (std::ostream & os, TestEnumPublic const v)
    {
        return os << static_cast < int32_t >(v);
    }

};

}

int main()
{
    std::cout << a::b::c::Test().value() << std::endl;
    std::cout << a::b::c::Test::TestEnumPublic::v0 << std::endl;
}

1 Ответ

0 голосов
/ 10 декабря 2018

Вопрос в том ... является ли класс вмещания правильной областью для объявления функции друга для вложенного перечисления?

Да.

Мой старый ответ былправильно, но не по теме.Для справки:

Объявите ваш оператор как свободную функцию, а не член класса - это всегда должно иметь место для operator<< в std::ostream.Если ваше перечисление является личным, вы должны также объявить эту функцию как друга класса.

РЕДАКТИРОВАТЬ:

Поскольку это друг, он не может быть вне класса.

Я думаю, именно поэтому вы запутались.

Объявление друга может повлиять на внешний метод класса.

https://en.cppreference.com/w/cpp/language/friend

...