web-dev-qa-db-ja.com

列挙型クラス「unsignedintに変換できませんでした」

私はこのような列挙型クラスを持っています:

    typedef unsigned int binary_instructions_t;

    enum class BinaryInstructions : binary_instructions_t
    {
        END_INSTRUCTION = 0x0,

        RESET,

        SET_STEP_TIME,
        SET_STOP_TIME,
        START,

        ADD
    };

そして、私は次のようなswitchステートメントで列挙型のメンバーを使用しようとしています:

const std::string& function(binary_instructions_t arg, bool& error_detect)
{
    switch(arg)
    {
        case (unsigned int)BinaryInstructions::END_INSTRUCTION:
            return "end";
        break;
    }
    translate_error = true;
    return "ERROR";
}

基になるタイプがすでに(unsigned int)であるのに、なぜunsigned intへのキャストが必要なのですか?

12
user3728501

これは、「列挙型クラス」が「強く型付けされている」ため、暗黙的に他の型に変換できないためです。 http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations

13
Freddie Chopin

C++ 11 強く型付けされた列挙型 は、設計上、暗黙的に整数型に変換できないためです。基になる型がunsigned intであるという事実は、列挙型の型がunsigned intであることを意味するわけではありません。 BinaryInstructionsです。

しかし、とにかく実際には変換は必要ありませんargはunsignedintであるため、キャストが必要ですが、わかりやすくするためにstatic_castを選択する必要があります。

switch(arg)
{
    case static_cast<unsigned int>(BinaryInstructions::END_INSTRUCTION) :
        return "end";
    break;
}
11
juanchopanza