1

VC++ v6 プロジェクトで正常にコンパイルされたクラスがありますが、VS2008 に移行するとコンパイル エラーが発生します (以下のコードの下に表示)。

template<class T> class my_enum_test 
{
public:
    enum EState { STARTING, RUNNING, STOPPING, STOPPED, IDLE};

    my_enum_test(T* object) : object_(object), state_(IDLE) {}

    my_enum_test<T>::EState get_state() const;

private:
    EState state;      // execution state
    T* object_;
};


template <class T>
my_enum_test<T>::EState my_enum_test<T>::get_state(
    ) const
{
    return state;
}


int main() {

    my_enum_test<int> my_test;
    my_enum_test<int>::EState the_state = my_test.get_state();

    return 0;
}

エラー:

Compiling...
main.cpp
main.cpp(9) : warning C4346: 'my_enum_test::EState' : dependent name is not a type
        prefix with 'typename' to indicate a type
        main.cpp(14) : see reference to class template instantiation 'my_enum_test'    being compiled
main.cpp(9) : error C2146: syntax error : missing ';' before identifier 'get_state'
main.cpp(9) : error C2875: using-declaration causes a multiple declaration of 'EState'
main.cpp(9) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
main.cpp(9) : warning C4183: 'get_state': missing return type; assumed to be a member function returning 'int'
main.cpp(18) : warning C4346: 'my_enum_test::EState' : dependent name is not a type
        prefix with 'typename' to indicate a type
main.cpp(18) : error C2143: syntax error : missing ';' before 'my_enum_test::get_state'
main.cpp(18) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
main.cpp(18) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Results

クラスが何もしないという事実を無視して、どうすればコンパイルの問題を修正できますか?

4

1 に答える 1

1

修飾された従属型名 ( ) があるため、曖昧さ回避ツールEStateを使用する必要があります。typename

    template <class T>
    typename my_enum_test<T>::EState my_enum_test<T>::get_state(
//  ^^^^^^^^
        ) const
    {
        return state;
    }

このようにして、コンパイラはそれEStateが静的メンバー変数の名前ではなく、型の名前であることを認識します。

于 2013-05-03T16:42:16.823 に答える