在我正在编写的一个石头剪刀布程序中,我列举了三个不同的动作并将它们声明为一个类。但是,当我尝试编写 using 语句以避免使用范围运算符时,它似乎不起作用。有谁知道为什么?
enum class choice {rock, paper, scissors};
using namespace choice;
这里出现一条错误消息,说:[Error] 'choice' 不是命名空间名称。为什么是这样?我认为在这种情况下,选择可能是一个名称空间。
在我正在编写的一个石头剪刀布程序中,我列举了三个不同的动作并将它们声明为一个类。但是,当我尝试编写 using 语句以避免使用范围运算符时,它似乎不起作用。有谁知道为什么?
enum class choice {rock, paper, scissors};
using namespace choice;
这里出现一条错误消息,说:[Error] 'choice' 不是命名空间名称。为什么是这样?我认为在这种情况下,选择可能是一个名称空间。
在 C++20, P1099R5中是可能的:
enum class choice {rock, paper, scissors};
using enum choice;
namespace choice
{
enum class type {rock, paper, scissors};
constexpr auto rock = type::rock ;
constexpr auto paper = type::paper ;
constexpr auto scissors = type::scissors;
}
int main()
{
choice::type move;
using namespace choice;
move = rock;
move = paper;
move = scissors;
return 0;
}
您想要的行为可以通过namespace choice { enum choice { ... }; }
. choice::choice
它只适用于值,如果你想声明一个变量,你仍然必须使用。当然,除非你也使用auto
.
这可能是一个非常古老的问题,但是为了扩展@catscradle 的答案和@anton_rh 的评论,如果您添加一个“使用”语句来为choice::choice 创建一个快捷方式,则可以使其更加方便:
namespace choice_values {
enum type {
rock,
paper,
scissors
}
}
using choice = choice_values::type;
现在,您可以正常使用枚举:
choice chosen_move = choice::rock;
但如果您使用choice_values 命名空间,您也可以避免使用范围运算符:
using namespace choice_values;
choice chosen_move = rock;
(我知道这可能作为评论更好,但我还没有这样做的声誉......)
如果像下面这样,我只使用“typedef A::B::C C”。
namespace A
{
class B
{
public:
enum class C : unsigned char
{
Something
};
};
}
我会做一些类似于 Lut_99 的事情(但略有不同):
namespace choice_ns {
enum Choice { rock, paper, scissors };
}
using choice_ns::Choice;
bool beats(Choice a, Choice b) {
using namespace choice_ns;
switch (a) {
case rock:
// etc...
}
void does_not_compile() {
rock; // This requires qualification.
}
请注意,enum class
没有使用,但可以达到类似的效果:choice_ns::
说 . 时必须使用前缀rock
。这避免了污染外部命名空间,这是enum class
. 另请注意,像 一样enum class
,您可以参考Choice
WITHOUTchoice_ns::
前缀。
命名空间的名称是故意尴尬的,因为你唯一需要它的时候就是在using namespace ...
你的函数开头说的时候。
这和 Lut_99 建议的一个区别是,如果你按照他的方式做,声明看起来像这样:
choice::type a;
与我的方式相比,这既冗长又尴尬:
Choice a;
其他一些建议涉及做
constexpr SomeType rock = whatever::rock;
但这真的不是很好,因为重复,这意味着你很有可能会犯错误,特别是如果你决定稍后添加值。例如https://www.youtube.com/watch?v=Kov2G0GouBw
我一直想要这个有一段时间了。很高兴从 Baptistou 看到,这将在不久的将来成为可能。同时,您可以使用当今可用的技术获得非常相似的东西。
enum class choice {rock, paper, scissors}
rock = choice::rock, paper = choice::paper, scissors = choice::scissors;
choice
不是命名空间,因此using namespace choice;
无效。如果您不想使用范围指示符,请不要使用范围枚举。一个普通的枚举将适用于您到目前为止提到的内容:
enum choice { rock, paper, scissors };