
关于C++枚举的简单问题
#include<iostream>enumSex{Male,Female};intmain(){usingstd::cout;usingstd::endl;Sexboy...
#include <iostream>
enum Sex
{
Male,
Female
};
int main()
{
using std::cout;
using std::endl;
Sex boy = Male;
Sex girl = Sex::Female; //关键是这一句
cout << boy << endl << girl << endl;
return 0;
}
从教材上看到的C++枚举变量赋值都是类似Sex boy = Male, 而Sex girl = Sex::Female这种是类似C#中的用法。
上述程序在VS2012中编译通过,但在VC6.0中编译错误:
error C2039: 'Female' : is not a member of 'Sex'
所以我想问下,类似Sex girl = Sex::Female这种用法是高版本VS提供的扩展,还是说已经归入到新的C++标准中了,即Sex girl = Sex::Female是不是依赖于特定的编译器才能编译通过。
希望回答者给出相关正式的说明或者证明。多谢。 展开
enum Sex
{
Male,
Female
};
int main()
{
using std::cout;
using std::endl;
Sex boy = Male;
Sex girl = Sex::Female; //关键是这一句
cout << boy << endl << girl << endl;
return 0;
}
从教材上看到的C++枚举变量赋值都是类似Sex boy = Male, 而Sex girl = Sex::Female这种是类似C#中的用法。
上述程序在VS2012中编译通过,但在VC6.0中编译错误:
error C2039: 'Female' : is not a member of 'Sex'
所以我想问下,类似Sex girl = Sex::Female这种用法是高版本VS提供的扩展,还是说已经归入到新的C++标准中了,即Sex girl = Sex::Female是不是依赖于特定的编译器才能编译通过。
希望回答者给出相关正式的说明或者证明。多谢。 展开
2个回答
展开全部
非标准的扩展使用, 也就是你要这么写就无法移植.
在VS2008上尽管可以通过编译, 但是给出警告C4482, 提示使用了非标准的扩展.
::是作用域限定符. 而枚举的中的值是属于外围作用域的成员.
所以Female等于::Female,是全局作用域里的成员,
Sex::Female有悖这种概念.因为这样看上去Sex更像是一个类或者是命名空间.
struct S {
enum E { a };
};
int i = S::E::a; // C4482
int j = S::a; // OK
在VS2008上尽管可以通过编译, 但是给出警告C4482, 提示使用了非标准的扩展.
::是作用域限定符. 而枚举的中的值是属于外围作用域的成员.
所以Female等于::Female,是全局作用域里的成员,
Sex::Female有悖这种概念.因为这样看上去Sex更像是一个类或者是命名空间.
struct S {
enum E { a };
};
int i = S::E::a; // C4482
int j = S::a; // OK
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询