繁体   English   中英

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

[英]Template parameter is not allowed in an integral constant expression

编译此代码(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;
}

我在网上找不到任何有用的信息,而且我一直在努力寻找问题所在。 有人可以澄清一下吗?

非常感谢。

这应该起作用,您正在传递函数,而C ++应该将其转换为函数指针。 也许您使该函数指针明确:

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

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

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

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

Value ValueGetter(JSObject *obj)

看起来像这样:

Value (*ValueGetter)(JSObject *obj)

然后再次:

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

C ++ 03中的相同位置存在相同的措词。

因此,您的代码有效,并且手边有一个编译器错误。

也许您可以自己调整模板参数来解决它,尽管它取决于错误是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM