#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;
Для меня это работает.