c ++枚举范围无法使用-std = c ++ 98进行编译,但是可以使用-std = c ++ 11进行编译

时间:2018-09-13 11:42:25

标签: c++ class c++11 enums c++98

如下所示的简单程序,完全没有c ++ 11语法(e.cpp)

#include<iostream>
using namespace std;
namespace m{
class my{
public:
    enum A{
        u=1,
        v=2,
        w=3
    };
    static A f(A a){
        return (A)(a + A::u);
    }
};
int main(){
    using namespace m;
    my::A r=my::f(my::u);
    return 0;
}

使用g ++ 4.1.2进行编译:

e.cpp:17:2: warning: no newline at end of file
e.cpp: In static member function ‘static m::my::A m::my::f(m::my::A)’:
e.cpp:11: error: expected primary-expression before ‘)’ token
e.cpp:11: error: ‘A’ is not a class or namespace

将g ++ 4.9.2与-std = c ++ 98一起使用

g++ e.cpp -std=c++98
e.cpp: In static member function ‘static m::my::A m::my::f(m::my::A)’:
e.cpp:11:36: error: ‘A’ is not a class or namespace
    static A f(A a){return (A)(a + A::u);}
                                    ^

但是使用-std = c ++ 11可以:

g++ e.cpp -std=c++11

要使其使用c ++ 98进行编译,我将其更改为避免将“ A ::”改为:

static A f(A a){return (A)(a + u);}

因此,似乎在c ++ 98下,嵌入的enum类无法在类内部识别,而在c ++ 11中则有效。这是枚举分辨率的差异,还是c ++ 98标准中的某些先前的语法错误?

2 个答案:

答案 0 :(得分:3)

在C ++ 11之前,不能使用枚举名称来限定枚举数。因此,在C ++ 98模式下没有错误,代码只是格式错误。

您推论规则已更改是正确的。

C ++常见问题解答lists the changes made to enumerations in C++11,并引用推动这些变化的提案。

答案 1 :(得分:3)

枚举值不受枚举类型的限制(在C ++ 98或C ++ 11中)。在以下示例中:

pd.read_sql()

namespace N { enum E { X }; } 直接在命名空间X的范围内。其完全合格的标识符为N

此行为已由C ++ 11更改,其中遵循相同的定义,::N::X的标识符也可以也可以使用X引用

  

[dcl.enum/11]

     

可以使用类成员访问来引用在类范围中声明的枚举数   运算符(::N::E::X::(点)和.(箭头)),请参阅5.2.5。 [示例:

->
     

-结束示例]