编译此代码时(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;
}
我在网上找不到任何有用的信息,我很难找到问题所在。有人可以澄清一下吗?
非常感谢。
答案 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是什么。