簡體   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