使用MSVC编译的模板不是使用GCC编译的

时间:2014-04-04 15:13:49

标签: c++ templates visual-c++ gcc

我有以下代码(简化以突出显示当前问题):

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声明有什么问题?

1 个答案:

答案 0 :(得分:3)

m_pfsbTo更改为

CFiniteStateTransitionBase<DATA,ENUM_STATES,ENUM_EVENTS>::m_pfsbTo

在虚拟功能中。

Scott Meyers解决了我引用的有效C ++第43项中的问题:

  

问题在于编译器遇到的定义   课程模板LoggingMsgSender,他们不知道它是什么课程   继承自。当然,它是MsgSender<Company>,但Company是一个   模板参数,直到稍后才知道的模板参数(何时   LoggingMsgSender已实例化)。不知道公司是什么,   没有办法知道班级MsgSender<Company>的样子。   特别是,无法知道它是否具有sendClear功能。

模拟名称,这完全适用于您的情况。