2

我有一个似乎已经在这里讨论过的问题: CPP 模板化成员函数专业化

但是解决方案this->template不适用于我的示例。

以下代码失败:

错误:“<未解析的重载函数类型>”和“int”类型的无效操作数
       到二进制'运算符<'

使用 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

快到了,你需要另一个template

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

问题是,由于GetNextState来自模板参数,它不知道它是静态变量、函数、模板函数还是任何东西。解析器需要继续,所以它假设它不是模板函数,所以<被解析为小于运算符,而不是模板参数列表的开头。从那里,解析器会感到困惑,并且您会收到有关无效操作数的错误>

于 2013-08-07T08:37:27.730 回答