从 Class 中的枚举中解析名称而无需限定
Resolving Names From an Enum Inside a Class Without Qualification
考虑以下因素:
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;
行上面的行来进行编译?如果不是,为什么不呢?如果是,请解释。
#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;
}
考虑以下因素:
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;
行上面的行来进行编译?如果不是,为什么不呢?如果是,请解释。
#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;
}