我有以下代码(简化以突出显示当前问题):
template <class ENUM_EVENTS>
class CFiniteStateEventBase {};
template <class DATA,class ENUM_STATES,class ENUM_EVENTS>
class CFiniteStateCursor {};
template <class DATA,class ENUM_STATES,class ENUM_EVENTS>
class CFiniteStateBase {};
template <class DATA,class ENUM_STATES,class ENUM_EVENTS>
class CFiniteStateTransitionBase
{
protected:
CFiniteStateBase<DATA,ENUM_STATES,ENUM_EVENTS> * m_pfsbTo;
public:
CFiniteStateTransitionBase(CFiniteStateBase<DATA,ENUM_STATES,ENUM_EVENTS> * pfsbTo)
: m_pfsbTo(pfsbTo) {}
virtual ~CFiniteStateTransitionBase() {}
virtual int VTransition() = 0;
};
template <class DATA,class ENUM_STATES,class ENUM_EVENTS>
class CFiniteStateYesTransition
: public CFiniteStateTransitionBase<DATA,ENUM_STATES,ENUM_EVENTS>
{
public:
CFiniteStateYesTransition(CFiniteStateBase<DATA,ENUM_STATES,ENUM_EVENTS> * pfsbTo)
: CFiniteStateTransitionBase<DATA,ENUM_STATES,ENUM_EVENTS>(pfsbTo) {}
virtual int VTransition()
{
m_pfsbTo = 0;
return 0;
}
};
它在MSVC(6和2012)上编译得很好但是GCC(CentOS 5.10上的3.4.6和4.1.2)我得到以下错误:
fsb.cpp:在成员函数'virtual int CFiniteStateYesTransition :: VTransition(CFiniteStateEventBase ,DATA,CFiniteStateBase ,CFiniteStateBase * ,CFiniteStateCursor )'中: fsb.cpp:33:erreur:'m_pfsbTo'未在此范围内声明
m_pfsbTo
声明有什么问题?
答案 0 :(得分:3)
将m_pfsbTo
更改为
CFiniteStateTransitionBase<DATA,ENUM_STATES,ENUM_EVENTS>::m_pfsbTo
在虚拟功能中。
Scott Meyers解决了我引用的有效C ++第43项中的问题:
问题在于编译器遇到的定义 课程模板
LoggingMsgSender
,他们不知道它是什么课程 继承自。当然,它是MsgSender<Company>
,但Company
是一个 模板参数,直到稍后才知道的模板参数(何时LoggingMsgSender
已实例化)。不知道公司是什么, 没有办法知道班级MsgSender<Company>
的样子。 特别是,无法知道它是否具有sendClear
功能。
模拟名称,这完全适用于您的情况。