18

私が書いているじゃんけんプログラムでは、3 つの異なる動きを列挙し、それらをクラスとして宣言しています。しかし、スコープ演算子の使用を避けるために using ステートメントを作成しようとすると、うまくいかないようです。理由を知っている人はいますか?

enum class choice {rock, paper, scissors};

using namespace choice;

[Error] 'choice' is not a namespace name. というエラー メッセージが表示されます。どうしてこれなの?このコンテキストでは、for の選択は名前空間になる可能性があると思いました。

4

8 に答える 8

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 に答える
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参照できることにも注意してください。Choicechoice_ns::

using namespace ...名前空間の名前は意図的にぎこちなくしています。名前空間が必要になるのは、関数の最初で言うときだけだからです。

これと Lut_99 が示唆することとの違いの 1 つは、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 に答える