如何为枚举类编写'using'语句?

时间:2013-06-07 00:36:56

标签: c++ class namespaces enumeration using

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

enum class choice {rock, paper, scissors};

using namespace choice;

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

8 个答案:

答案 0 :(得分:3)

您可以使用namespace choice { enum choice { ... }; }实现所需的行为。它只适用于值,如果要声明变量,仍然必须使用choice::choice。除非您当然也使用auto

答案 1 :(得分:3)

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

$this->set_directory( "user" );
$route['default_controller'] = 'home/index';

答案 2 :(得分:0)

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

enum choice { rock, paper, scissors };

答案 3 :(得分:0)

enum class choice {rock, paper, scissors}
rock = choice::rock, paper = choice::paper, scissors = choice::scissors;

答案 4 :(得分:0)

如果如下,我只使用" typedef A :: B :: C C"。

namespace A
{
    class B
    {
    public:
        enum class C : unsigned char
        {
            Something
        };
    };
}

答案 5 :(得分:0)

:/

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;
}

-__-

答案 6 :(得分:0)

这可能是一个非常古老的问题,但是为了扩展@catscradle 的回答和@anton_rh 的评论,如果您添加一个“using”语句来为选择创建快捷方式,则可以使其更加方便::选择:< /p>

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;

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

答案 7 :(得分: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 一样,您可以在没有 Choice 前缀的情况下引用 choice_ns::

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

这与 Lut_99 建议的不同之处在于,如果你按照他的方式去做,声明看起来像这样:

choice::type a;

与我的方式相比,这既冗长又笨拙:

Choice a;

其他一些建议涉及做

constexpr SomeType rock = whatever::rock;

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

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