在C ++中,我试图基于类为游戏制作一个简单的状态机。
stateMan.setState<mainMenuState>();
我的课程声明如下:
class stateManager
{
...
template <class T>
void setState(void);
}
测试代码为:
template <class T>
void stateManager::setState<T>(void)
{
T* blah = new T;
delete blah;
}
显然,自function template partial specialization ‘setState<T>’ is not allowed
以来这不起作用。
除了非OO之外,还有更好的方法吗?
答案 0 :(得分:3)
成员函数模板的定义应为:
template <class T>
void stateManager::setState(void)
{
//...
}
也就是说,它应该只是setState
而不是setState<T>
。后一种语法用于函数模板特化。由于T
是一个类型参数,因此特殊化将被视为函数部分模板特化,这是不允许的。
答案 1 :(得分:1)
很难说没有细节,但你可以做一个基础State
类,不同的状态继承它。
如果您仍想使用类,您可以看到一个有趣的 example using boost.mpl
答案 2 :(得分:1)
避免使用模板的另一个选项是为游戏状态定义纯虚拟基类,然后将对不同游戏状态的引用传递给您的函数。例如,
//pure virtual base class that will define the state interfaces
class base_state { /*...*/ };
//a derived state class
class mainMenuState : public base_state { /*...*/ };
class stateManager
{
//...
//you can pass any derived base_state to this function
void setState(base_state* state);
};