声明嵌套枚举类的朋友插入运算符(运算符<<)

时间:2018-12-10 14:19:49

标签: c++ enums c++17

对于具有嵌套枚举类的类,应在哪里声明嵌套枚举的Friend运算符。因为是朋友,所以不能超出课堂。但是没有办法在c ++的枚举类声明中定义朋友运算符。因此,是否应在嵌套枚举的类中声明它?这适用于公共和私有枚举声明

编辑:问题是...封装类是声明嵌套枚举的友好函数的正确范围吗?

#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 :(得分:1)

  

问题是...封装类是否是声明嵌套枚举的友好函数的正确范围?

是的

我的旧答案是正确的,但题外话。 供参考:

将您的运算符声明为自由函数,而不是类的成员-operator<<std::ostream的情况应始终如此。如果您的枚举是私有的,则还应该将该函数声明为该类的朋友。

编辑:

  

因为是朋友,所以不能在课堂之外。

我想这就是你感到困惑的原因。

朋友声明会影响类的外部方法。

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

相关问题