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

Templates compiling with MSVC not with GCC

本文关键字:编译 GCC MSVC 使用      更新时间:2023-10-16

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

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: In member function 'virtual int CFiniteStateYesTransition::VTransition(CFiniteStateEventBase, DATA, CFiniteStateBase, CFiniteStateBase*, CFiniteStateCursor)': FSB.cpp:33:erreur:"m_pfsbTo"未在此范围内声明

m_pfsbTo声明有什么问题?

m_pfsbTo更改为

CFiniteStateTransitionBase<DATA,ENUM_STATES,ENUM_EVENTS>::m_pfsbTo

在虚拟功能内。

斯科特·迈耶斯(Scott Meyers)在有效C++的第43项中谈到了这个问题,我引用了:

问题是,当编译器遇到 类模板LoggingMsgSender,他们不知道它是什么类 继承自。当然,这很MsgSender<Company>,但Company是一个 模板参数,直到以后才知道(当 LoggingMsgSender实例化)。不知道公司是什么, 没有办法知道类MsgSender<Company>是什么样子的。 特别是没有办法知道它是否具有sendClear功能。

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