18

在我正在编写的一个石头剪刀布程序中,我列举了三个不同的动作并将它们声明为一个类。但是,当我尝试编写 using 语句以避免使用范围运算符时,它似乎不起作用。有谁知道为什么?

enum class choice {rock, paper, scissors};

using namespace choice;

这里出现一条错误消息,说:[Error] 'choice' 不是命名空间名称。为什么是这样?我认为在这种情况下,选择可能是一个名称空间。

4

8 回答 8

22

在 C++20, P1099R5中是可能的:

enum class choice {rock, paper, scissors};

using enum choice;
于 2019-11-20T14:23:04.233 回答
8
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;
}
于 2018-02-22T16:05:59.350 回答
4

您想要的行为可以通过namespace choice { enum choice { ... }; }. choice::choice它只适用于值,如果你想声明一个变量,你仍然必须使用。当然,除非你也使用auto.

于 2013-06-07T06:25:22.320 回答
1

这可能是一个非常古老的问题,但是为了扩展@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;

(我知道这可能作为评论更好,但我还没有这样做的声誉......)

于 2020-12-21T11:19:44.523 回答
1

如果像下面这样,我只使用“typedef A::B::C C”。

namespace A
{
    class B
    {
    public:
        enum class C : unsigned char
        {
            Something
        };
    };
}
于 2017-07-13T08:40:57.020 回答
0

我会做一些类似于 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,您可以参考ChoiceWITHOUTchoice_ns::前缀。

命名空间的名称是故意尴尬的,因为你唯一需要它的时候就是在using namespace ...你的函数开头说的时候。

这和 Lut_99 建议的一个区别是,如果你按照他的方式做,声明看起来像这样:

choice::type a;

与我的方式相比,这既冗长又尴尬:

Choice a;

其他一些建议涉及做

constexpr SomeType rock = whatever::rock;

但这真的不是很好,因为重复,这意味着你很有可能会犯错误,特别是如果你决定稍后添加值。例如https://www.youtube.com/watch?v=Kov2G0GouBw

我一直想要这个有一段时间了。很高兴从 Baptistou 看到,这将在不久的将来成为可能。同时,您可以使用当今可用的技术获得非常相似的东西。

于 2021-05-19T20:01:46.907 回答
-1
enum class choice {rock, paper, scissors}
rock = choice::rock, paper = choice::paper, scissors = choice::scissors;
于 2013-06-07T03:49:49.410 回答
-1

choice不是命名空间,因此using namespace choice;无效。如果您不想使用范围指示符,请不要使用范围枚举。一个普通的枚举将适用于您到目前为止提到的内容:

enum choice { rock, paper, scissors };
于 2013-06-07T00:46:30.840 回答