C++ 如何访问成员enum';其他类别(c+;+;)的s

C++ 如何访问成员enum';其他类别(c+;+;)的s,c++,class,enums,nested,C++,Class,Enums,Nested,我需要访问属于另一个类的公共枚举,为了简化,类似这样: class obj { public: enum Type { t1, t2, t3 }; Type type; }; class otherObj { public: void setType(obj* o); }; void otherObj::setType(obj* o) { o->type = obj::Type::t

我需要访问属于另一个类的公共枚举,为了简化,类似这样:

class obj
{
public:

    enum Type
    {
        t1,
        t2,
        t3
    };

    Type type;
};

class otherObj
{
public:

    void setType(obj* o);

};

void otherObj::setType(obj* o)
{
    o->type = obj::Type::t1;
    return;
}
我该怎么做,因为这条线

o->type = obj::Type::t1;
抛出一个错误:

obj::Type is not a class or namespace.
难道C++的枚举不是很棒吗?即使枚举可以被视为一种类型,这些值也属于它们上面的范围。

您可以使用

obj::t1;
或者使用
enum
声明指定

enum class Type {
    t1,
    t2,
    t3
};

在C++03中,枚举值属于封闭范围。因此,将
obj::Type::t1
替换为
obj::t1
将对您有效


这有点违反直觉,C++11中的
enum类
特性解决了这一问题,它将枚举值直接放在enum范围内。因此,如果您在符合C++11的编译器中使用
enum类
,那么您将能够像当前一样使用
obj::Type::t1

你的代码适合我。实际上添加class属性并没有解决它。它向我显示了一个警告,我正在使用C++11功能,但仍然不起作用。也许我需要在某个地方更改编译器设置?@V0ldek“它向我显示了一个警告,说明我正在使用C++11功能”如果您打开
--std=C++11
来修复此问题,这是当前的标准。也许您应该寻找一个更为新近的C++编译器,它默认运行在这种模式下。
enum class Type {
    t1,
    t2,
    t3
};