在整数常量表达式中不允许使用模板参数

时间:2014-01-14 12:51:26

标签: c++ templates compiler-errors spidermonkey

编译此代码时(SpiderMonkey的一部分):

template<IsAcceptableThis Test, NativeImpl Impl>
JS_ALWAYS_INLINE bool
CallNonGenericMethod(JSContext *cx, CallArgs args)
{
    const Value &thisv = args.thisv();
    if (Test(thisv))
        return Impl(cx, args);

    return detail::CallMethodIfWrapped(cx, Test, Impl, args);
}

template<Value ValueGetter(JSObject *obj)>
static JSBool
Getter(JSContext *cx, unsigned argc, Value *vp)
{
    CallArgs args = CallArgsFromVp(argc, vp);
    return CallNonGenericMethod<ThisTypeArray::IsThisClass,
                                ThisTypeArray::GetterImpl<ValueGetter> >(cx, args);
}

我收到此错误,与调用CallNonGenericMethod

有关

错误:在整型常量表达式中不允许使用类型为“JS :: Value( )(JSObject *)”的模板参数“ValueGetter”,因为它不是整数或枚举类型*

其中ValueGetter

inline Value
TypedArray::lengthValue(JSObject *obj)
{
    JS_ASSERT(obj->isTypedArray());
    return obj->getFixedSlot(LENGTH_SLOT);
}

template<Value ValueGetter(JSObject *obj)>
static bool
GetterImpl(JSContext *cx, CallArgs args)
{
    JS_ASSERT(IsThisClass(args.thisv()));
    args.rval().set(ValueGetter(&args.thisv().toObject()));
    return true;
}

我在网上找不到任何有用的信息,我很难找到问题所在。有人可以澄清一下吗?

非常感谢。

2 个答案:

答案 0 :(得分:2)

这应该可行,你传递一个函数,C ++应该把它变成一个函数指针。也许您将该函数指针显式化:

template<Value (*ValueGetter)(JSObject *obj)>

答案 1 :(得分:1)

  

[C++11: 14.1/4]: 非类型模板参数应具有以下(可选的cv限定)类型之一:

     
      
  • 整数或枚举类型,
  •   
  • 指向对象的指针或指向函数的指针
  •   
  • 对对象的左值引用或对函数的左值引用,
  •   
  • 指向成员的指针,
  •   
  • 的std :: nullptr_t。
  •   

但是指向函数的指针看起来不像这样:

Value ValueGetter(JSObject *obj)

看起来像这样:

Value (*ValueGetter)(JSObject *obj)

然后再说:

  

[C++11: 14.1/8]: 类型“数组T”或“函数返回{{1}的非类型模板参数分别调整为”指向T的指针“或”指向函数返回T的指针。

C ++ 03中存在相同的措辞,位于同一位置。

因此,您的代码是有效的,并且您手上有编译错误。

也许你可以通过自己调整 template-parameter 解决它,虽然它将取决于bug是什么。