对于具有嵌套枚举类的类,应在哪里声明嵌套枚举的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;
}
答案 0 :(得分:1)
问题是...封装类是否是声明嵌套枚举的友好函数的正确范围?
是的
我的旧答案是正确的,但题外话。 供参考:
将您的运算符声明为自由函数,而不是类的成员-operator<<
到std::ostream
的情况应始终如此。如果您的枚举是私有的,则还应该将该函数声明为该类的朋友。
编辑:
因为是朋友,所以不能在课堂之外。
我想这就是你感到困惑的原因。
朋友声明会影响类的外部方法。