繁体   English   中英

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

[英]c++ enum scope failed to compile with -std=c++98, but ok with -std=c++11

一个简单的程序如下,根本没有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下,嵌入的枚举类在类中是不可识别的,而在c ++ 11中它可以工作。 这是枚举解决方案的差异,还是c ++ 98标准中的一些先前语法错误?

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

在推断规则已经改变时你是正确的。

C ++ FAQ 列出了对C ++ 11中枚举的更改 ,并列举了推动这些更改的提议。

枚举值的范围不是枚举类型(在C ++ 98或C ++ 11中)。 在以下示例中:

namespace N {
    enum E { X };
}

X直接在命名空间N的范围内。 它的完全限定标识符是::N::X

C ++ 11改变了这种行为,其中遵循相同的定义, X的标识符可以使用::N::E::X引用:

[dcl.enum/11]

在类范围中声明的枚举器可以使用类成员访问运算符( ::. (dot)和-> (箭头))来引用,请参见5.2.5。 [例如:

 struct X { enum direction { left='l', right='r' }; int f(int i) { return i==left ? 0 : i==right ? 1 : 2; } }; void g(X* p) { direction d; // error: direction not in scope int i; i = p->f(left); // error: left not in scope i = p->f(X::right); // OK i = p->f(p->left); // OK // ... } 

- 末端的例子]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM