使用 MSVC 而不是使用 GCC 编译的模板
Templates compiling with MSVC not with 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: 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
功能。
模化名称,这完全适用于您的情况。
相关文章:
- 为什么 gcc 编译这个而 msvc 没有
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- GCC,CMake,预编译标头和维护依赖项
- GCC 8.3 无法编译 std::bind_front
- Clang不会编译GCC会编译的模板专业化
- 使用交叉工具ng编译gcc时出错
- 编译 GCC-5.0 OS X 狮子 dyld:找不到符号:__ZNKSt11logic_error4whatEv
- 在类中将不完整类型的unique_ptr初始化为 nullptr 时编译 gcc 错误
- 除了 Linux 上的源代码和编译 (GCC) 之外,有没有办法在 Windows 中托管 IDE
- 在 64 位 debian 上编译 GCC 的代码可视化补丁
- 编译gcc 4.6.4中的boost::move
- 模板编译:gcc vs VS2010
- C++ 使用编译器编译"gcc"简单文件
- 如何从php编译GCC
- 在 Visual Studio 中编译 gcc 代码会导致错误 C3646:"__attribute__":未知的覆盖说明符
- 在windows上编译gcc 4.7
- 在Vortex86DX上从头开始构建和编译GCC 5.2.0时出错
- 在编译GCC时出错部分模板专门化,而不是MSVC
- GLM Math lib 编译 GCC 错误
- Synology交叉编译GCC -std=c++0x