Синтаксическая ошибка при специализации шаблона GCC, но не MSVC - PullRequest
1 голос
/ 05 ноября 2011

Следующий код прекрасно компилируется с использованием 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

Ответы [ 2 ]

5 голосов
/ 05 ноября 2011

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. Вы не помогаете себе использовать макросы для чего-либо, скорее наоборот.

0 голосов
/ 05 ноября 2011

Обычно GCC дает вам номера строк.И, возможно, вы используете некоторые функции языка C ++, которые лучше поддерживаются в самых последних версиях GCC.Вы пробовали GCC 4.6?И GCC могут быть предоставлены аргументы (например, здесь или более вероятно -std=c++0x), управляющие диалектом, который он принимает.Я считаю, что недавний GCC (т. Е. g++ 4.6) приложил немало усилий для соответствия языковым стандартам.И GCC 4.6 может даже дать вам номера столбцов в сообщениях об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...