[英]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.