【问题标题】:Compile error with a template when building with GCC but not MSVC使用 GCC 而不是 MSVC 构建时使用模板编译错误
【发布时间】:2011-12-17 02:54:26
【问题描述】:

关于表达式:

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

gcc 显示以下错误:

错误:‘rdoRuntime::RDOValue::operator-’不能出现在 常量表达式

错误:'&' 不能出现在常量表达式中

错误:模板参数 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);
};

【问题讨论】:

  • 您能帮我们粘贴RDOCalcUnary 的定义,以便我们知道模板参数应该是什么吗?这段代码在我看来完全没有意义......
  • 如果去掉括号会发生什么?据我所知,它们不应该是必需的
  • 我删除了括号,编译器不再给出错误......让我们看看当我收集整个应用程序时会发生什么。谢谢。

标签: c++ templates visual-c++ gcc syntax-error


【解决方案1】:

当你做 typedef 时不要使用括号:

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

对我有用。

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多