2

ここですでに議論されているように見える問題があります: CPPテンプレートメンバー関数の特殊化

しかし、this->template私の例では解決策がうまくいきませんでした。

次のコードは失敗します。

エラー: 型 '<未解決のオーバーロードされた関数型>' および 'int' のオペランドが無効です
       バイナリ 'operator<' へ

gcc 4.8.1 で

class Base { public: virtual int Do(){return 0;} };
class State1: public Base {};
class State2: public Base {};

template <typename ... T> class SM;

template <class StateBase, class HeadState, class ... States >
class SM<StateBase, HeadState, States...> : public SM< StateBase, States...>
{
    protected:
        HeadState headState;
        template<int cnt> StateBase* GetNextState ( unsigned int index ) { return headState; }
};  

template <class StateBase, class HeadState>
class SM< StateBase, HeadState>
{
    protected:
        HeadState headState;
        template<int cnt> StateBase* GetNextState ( unsigned int index ) { return headState; }
};  

template <class StateBase, class ... States >
class TopSM: public SM< StateBase, States...>
{
    public:
        void DoIt()
        {
            // following code fails with 
            // error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
            int nextState = this->template SM< StateBase, States...>::GetNextState <1>( 1 );
        }
};  

TopSM<Base, State1, State2> sm;

int main()
{
    sm.DoIt();
    return 0;
}
4

2 に答える 2

5

templateの前に別のものが必要ですGetNextState。識別子と 、.->または::の前にテンプレート引数があり、それがテンプレート パラメーターに依存する何かのメンバーである場合、template小なり記号を明確にするためのキーワードが必要です。

int nextState = this->template SM< StateBase, States...>::template GetNextState <1>( 1 );
于 2013-08-07T08:36:57.067 に答える
2

もう少しで、もう 1 つ必要ですtemplate

int nextState = this->template SM< StateBase, States...>::template GetNextState <1>( 1 );
                                                          ~~~~~~~~

問題はGetNextState、テンプレート パラメーターに由来するため、それが静的変数、関数、テンプレート関数などであるかどうかがわからないことです。パーサーは続行する必要があるため、テンプレート関数ではないと想定し<、テンプレート パラメーター リストの先頭ではなく、小なり演算子として解析します。そこから、パーサーが混乱し、 への無効なオペランドに関するエラーが発生します>

于 2013-08-07T08:37:27.730 に答える