请考虑以下事项:
class Class { public:
enum Enum {
FOO, BAR
};
};
void routine(void) {
int x = Class::Enum::FOO; //Option 1
int y = Class::FOO; //Option 2
using Alias = Class::Enum; //Option 3
int z = Alias::FOO;
using Class::Enum; //Option 4 (line 15)
int w = FOO;
}
选项1 是完全资格。
C ++还允许选项2 。
写入的选项4 将失败; g ++告诉我:
15 : error: using declaration cannot refer to class member
using Class::Enum;
~~~~~~~^
15 : note: use an alias declaration instead
using Class::Enum;
^
在跟随它后的int w = FOO;
行进行。
我认为g ++建议的是选项3 。不幸的是,这仍然需要一个令人讨厌的资格。
我的问题:有没有办法让int w = FOO;
行通过某种方式修复它上面的行来编译?如果没有,为什么不呢?如果是,请解释。
答案 0 :(得分:2)
#include <iostream>
class Class { public:
enum Enum {
FOO, BAR
};
};
using namespace std;
auto main() -> int
{
int x = Class::Enum::FOO; //Option 1
cout << x << endl;
int y = Class::FOO; //Option 2
cout << y << endl;
using Alias = Class::Enum; //Option 3
int z = Alias::FOO;
cout << z << endl;
static constexpr auto FOO = Class::FOO; //Option 4 (line 15)
int w = FOO;
cout << w << endl;
return 0;
}