2

これは私が練習用に作成したコードです。これをコンパイルすると、cin >> の選択がコンパイルされません。「エラー 2 エラー C2088: '>>' : クラスに対して不正」および「エラー 1 エラー C2371: '選択' : 再定義; 異なる基本型」と表示されます。これを解決する方法についてアドバイスをもらえますか? とても有難い!

#include <iostream>

using namespace std;

int main()
{
    cout << "Difficulty levels\n\n";
    cout << "Easy - 0\n";
    cout << "Normal - 1\n";
    cout << "Hard - 2\n";

    enum options { Easy, Normal, Hard, Undecided };
    options choice = Undecided;
    cout << "Your choice: ";
    int choice;
    cin >> choice;

    switch (choice)
    {
    case 0:
        cout << "You picked Easy.\n";
        break;
    case 1:
        cout << "You picked Normal. \n";
        break;
    case 2:
        cout << "You picked Hard. \n";
        break;
    default:
        cout << "You made an illegal choice.\n";
    }

    return 0;
}
4

2 に答える 2

6

「エラー 2 エラー C2088: '>>' : クラスに対して不正です」および「エラー 1 エラー C2371: '選択' : 再定義; 基本型が異なります」と表示されます。これを解決する方法についてアドバイスをもらえますか?

もちろん、あなたが書いたものを見てみましょう:

...
options choice = Undecided;
// ^^^^^^^^^^^
cout << "Your choice: ";
int choice;
// ^^^^^^^^
cin >> choice;
..

これは間違いです。まず、同じ変数を一度だけ定義する必要があります。第 2 に、列挙子には operator>> がオーバーロードされていないため、前者の宣言は使用できません。

解決策は前者を削除することです。したがって、これを全体的に記述します(醜いインデントを修正して):

main.cpp

#include <iostream>

using namespace std;

int main()
{
    enum options { Easy, Normal, Hard, Undecided };
    cout << "Difficulty levels\n\n";
    cout << "Easy - " << Easy << "\n";
    cout << "Normal - " << Normal << "\n";
    cout << "Hard - " << Hard << "\n";
    cout << "Your choice: ";
    int choice;
    cin >> choice;

    switch (choice)
    {
    case Easy:
        cout << "You picked Easy.\n";
        break;
    case Normal:
        cout << "You picked Normal.\n";
        break;
    case Hard:
        cout << "You picked Hard.\n";
        break;
    default:
        cout << "You made an illegal choice.\n";
    }

    return 0;
}

出力

g++ main.cpp && ./a.out 
Difficulty levels

Easy - 0
Normal - 1
Hard - 2
Your choice: 0
You picked Easy.
于 2014-04-18T05:13:47.257 に答える
4

整数を読み取る必要がないように、独自の演算子を作成できます。1 つの方法を次に示します。

bool consume(std::istream& is, const char* p)
{
    while (*p)
        if (is.get() != *p++)
        {
            is.setstate(std::ios::failbit);
            return false;
        }
    return true;
}

std::istream& operator>>(std::istream& is, options& o)
{
     switch (is.get())
     {
        case 'E': if (consume(is, "asy") { o = Easy; return is; } break;
        case 'H': if (consume(is, "ard") { o = Hard; return is; } break;
        case 'N': if (consume(is, "ormal") { o = Normal; return is; } break;
        case 'U': if (consume(is, "ndecided") { o = Undecided; return is; } break;
     }
     is.setstate(std::ios::failbit);
     return is;
}

同様に、出力演算子を書くことができます:

std::ostream& operator<<(std::ostream& os, options o)
{
    return os << (o == Easy ? "Easy" :
                  o == Hard ? "Hard" :
                  o == Normal ? "Normal" :
                  o == Undecided ? "Undecided" :
                                   "<invalid option>");
}

これらにより、次のことが可能になります。

enum options { Easy, Normal, Hard, Undecided };

...streaming operators go here...

int main()
{
    cout << "Difficulty levels\n\n";
    cout << "Easy\n";
    cout << "Normal\n";
    cout << "Hard\n";

    options choice = Undecided;
    cout << "Your choice: ";
    if (cin >> choice)
        cout << "You picked " << choice << '\n';
    else
        cout << "Error while reading your choice.\n";
}
于 2014-04-18T05:32:05.543 に答える