如下所示的简单程序,完全没有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标准中的某些先前的语法错误?
答案 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。 [示例:->
-结束示例]