【发布时间】:2016-02-09 19:17:52
【问题描述】:
这是我正在尝试编写的代码的简化版本:
template<typename Derived>
class StateMachine
{
public:
void SetState(Derived::State s) {
static_cast<Derived*>(this)->TransitionTo(s);
}
};
class MyFSM : public StateMachine<MyFSM>
{
public:
enum class State {
State1,
State2,
State3
};
void TransitionTo(State s) {
_state = s;
}
private:
State _state = State::State1;
};
我正在使用 c++11 和 clang。我在这里得到的错误是10:17: error: missing 'typename' prior to dependent type name 'Derived::State',用于声明SetState。我也尝试添加typename Derived::State DerivedState;,然后使用DerivedState 而不是Derived::State,但后来我得到error: unknown type name 'DerivedState'。
更令人困惑的是,我尝试了typedef typename Derived::State DerivedState;,然后我得到了错误:error: no type named 'State' in 'MyFSM'。我最后一次尝试是typedef enum class Derived::State DerivedState;,然后我得到了最令人困惑的错误:error: no enum named 'State' in 'MyFSM'。
我对这里的模板不够了解,欢迎任何帮助理解这一点!此外,这里可能有更好的模式可以使用。我的主要目标是StateMachine 类具有一些通用功能,然后有一堆不同的状态机,每个都有自己的状态和转换功能。我有另一种方法,需要将this 传递给SetState(当从MyFSM 内部调用时,这是我正在做的事情的简化版本),但这是丑陋的,因为它自己的原因。我很想避免这种带模板的类的事情,但我的主要目标是使派生类尽可能易于编写和理解。
【问题讨论】:
-
你似乎混淆了
typename和typedef。 -
@n.m,这不是问题。问题是如果没有
Derived的完整定义,就找不到Derived::State。 -
@n.m.,没有
Derived的完整定义,可以找到typename Derived::State。 -
@RSahu 我正在解决第一个编译错误。在这种情况下需要 typename 关键字。在解决第一个问题之前谈论其他问题是没有意义的。
-
@n.m.,OP 尝试了
typename路线,但不知道如何从那里继续。