以下代码使用MSVC 2008编译正常。当您构建GCC时,会遇到很多错误(代码后出错)。应该怎么做才能解决错误?
#define FORCE_INLINE inline
#define CREF(A) const A&
template <class F>
class RDOFunCalcStd: public RDOFunCalc
{
...
template <int paramCount>
FORCE_INLINE void calc(CREF(LPRDORuntime) pRuntime);
template <>
FORCE_INLINE void calc<1>(CREF(LPRDORuntime) pRuntime)
{
m_value = m_pFunction(getParam<F::arg1_type>(pRuntime, 0));
}
template <>
FORCE_INLINE void calc<2>(CREF(LPRDORuntime) pRuntime)
{
m_value = m_pFunction(getParam<F::arg1_type>(pRuntime, 0), getParam<F::arg2_type>(pRuntime, 1));
}
};
GCC提供以下错误:
error: too many template-parameter-lists
error: explicit specialization in non-namespace scope ‘class rdoRuntime::RDOFunCalcStd<F>’
error: variable or field ‘calc’ declared void
error: expected ‘;’ before ‘<’ token
error: expected ‘;’ before ‘template’
error: explicit specialization in non-namespace scope ‘class rdoRuntime::RDOFunCalcStd<F>’
error: variable or field ‘calc’ declared void
error: expected ‘;’ before ‘<’ token
答案 0 :(得分:5)
MSVC允许作为扩展,在类中专门化成员函数,但这不是标准的。
如果您希望专门化成员函数,则应在命名空间级别执行此操作。
// note: use "inline" so that the linker merges multiple definitions
template <class F>
template <>
inline void RDOFunCalcStd<F>::calc<1>(LPRDORuntime const& pRuntime)
{
m_value = m_pFunction(getParam<typename F::arg1_type>(pRuntime, 0));
}
另外,FORCE_INLINE
有点错误,inline
是一个提示,而不是编译器的命令,所以你不强迫任何东西。我也没有完全看到CREF
的观点。你没有帮助自己使用宏来做任何事情,恰恰相反。
答案 1 :(得分:0)
通常,GCC会为您提供行号。也许您正在使用一些C ++语言功能,这些功能在最近的GCC中得到了更好的支持。你试过GCC 4.6吗?并且可以给GCC提供管理其接受的方言的参数(如here或更可能-std=c++0x
)。我相信最近的GCC(即g++
4.6)在语言标准一致性方面做了很多努力。 GCC 4.6甚至可以在错误消息中为您提供列号。