首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++枚举作用域无法用-std=c++98编译,但在-std=c++11中没有问题

c++枚举作用域无法用-std=c++98编译,但在-std=c++11中没有问题
EN

Stack Overflow用户
提问于 2018-09-13 11:42:24
回答 2查看 984关注 0票数 4

一个简单的程序,如下所示,根本没有c++11语法(e.cpp)

代码语言:javascript
复制
#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编译它:

代码语言:javascript
复制
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的结合

代码语言:javascript
复制
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是可以的:

代码语言:javascript
复制
g++ e.cpp -std=c++11

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

代码语言:javascript
复制
static A f(A a){return (A)(a + u);}

因此,在c++98中,嵌入的枚举类在类中是不被识别的,而在c++11中则是工作的。这是枚举解析上的差异,还是c++98标准中以前的语法错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-13 11:54:08

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

代码语言:javascript
复制
namespace N {
    enum E { X };
}

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

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

[dcl.enum/11] 类范围中声明的枚举数可以使用类成员访问操作符(::. (点)和-> (箭头))引用,参见5.2.5。示例: 结构X{ enum方向{左侧=‘l’,右=‘r’};int f(int i) {返回i==left ?0: i==right ?1: 2;};void g(X* p) {方向d;//错误:不位于范围int i中的方向;i=p->f(左);//错误:左不位于范围i=p->f(X::右);// OK i=p->f(p->左);// OK // .} -end实例

票数 3
EN

Stack Overflow用户

发布于 2018-09-13 11:52:27

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

你推断规则变了是正确的。

C++ FAQ 列出对C++11中的枚举所做的更改,并引用了推动这些变化的建议。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52312997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档