Ошибка компиляции с шаблоном при сборке с использованием GCC, но не MSVC

#c #templates #visual-c #gcc #syntax-error

#c #шаблоны #visual-c #gcc #синтаксическая ошибка

Вопрос:

При выражении:

 typedef RDOCalcUnary<RDOValue, (amp;RDOValue::operator-), OperatorType::OT_ARITHM> RDOCalcUMinus;
  

gcc показывает следующие ошибки:

ошибка: ‘rdoRuntime::RDOValue::operator-’ не может отображаться в константном выражении

ошибка: ‘amp;’ не может отображаться в константном выражении

ошибка: аргумент шаблона 2 недопустим

ошибка: недопустимый тип в объявлении перед токеном ‘;’

Под Windows компилятор MSVC компилирует код без ошибок.

В чем проблема? Как мне это исправить?

 template <typename ret_type, ret_type (RDOValue::*pOperator)() const, typename OperatorType::Type CalcType>
class RDOCalcUnary: public RDOCalcUnaryBase
{
friend class rdo::Factory<RDOCalcUnary<ret_type, pOperator, CalcType> >;
public:
    enum { calc_type = CalcType };
    typedef ret_type (RDOValue::*value_operator)() const;

    static RDOSrcInfo     getStaticSrcInfo(CREF(RDOSrcInfo::Position) position, CREF(LPRDOCalc) pUnaryCalc);
    static value_operator getOperation    ();

protected:
    RDOCalcUnary(CREF(RDOSrcInfo::Position) position, CREF(LPRDOCalc) pOperation);

private:
    REF(RDOValue) doCalc(CREF(LPRDORuntime) pRuntime);
};
  

Комментарии:

1. Можете ли вы вставить определение RDOCalcUnary для нас, чтобы мы знали, какими должны быть параметры шаблона? Этот код выглядит совершенно бессмысленным для меня…

2. Что произойдет, если убрать круглые скобки? Насколько я могу судить, они не нужны

3. Я удалил круглые скобки, и компилятор больше не выдает ошибку… давайте посмотрим, что произойдет, когда я соберу все приложение. Спасибо.

Ответ №1:

Когда вы выполняете typedef, не используйте скобки:

 typedef RDOCalcUnary<RDOValue, amp;RDOValue::operator-, OperatorType::OT_ARITHM> RDOCalcUMinus;
  

Для меня это работает.