Параметр шаблона не допускается в интегральном константном выражении

При компиляции этого кода (часть 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,

ошибка: параметр шаблона ‘ValueGetter’ типа ‘JS :: Value () (JSObject *) ‘не допускается в выражении с интегральной константой, поскольку оно не имеет целочисленного или перечислимого типа *

где 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

Решение

Это должно работать, вы передаете функцию, а C ++ должен превратить ее в указатель на функцию. Может быть, вы сделаете указатель на эту функцию явным:

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

Другие решения

[C++11: 14.1/4]: Нетипизированный шаблон-параметр должен иметь один из следующих (необязательно квалифицированных cv) типов:

  • интеграл или тип перечисления,
  • указатель на объект или указатель на функцию,
  • lvalue ссылка на объект или lvalue ссылка на функцию,
  • указатель на член,
  • станд :: nullptr_t.

Но указатель на функцию не выглядит так:

Value ValueGetter(JSObject *obj)

Это выглядит так:

Value (*ValueGetter)(JSObject *obj)

Тогда снова:

[C++11: 14.1/8]: Не тип Шаблон-параметр типа «Массив T» или же «Функция возврата T» настроен на тип «указатель на T» или же «Указатель на функцию, возвращающую T», соответственно.

Та же самая формулировка существует в C ++ 03, в том же месте.

Итак, ваш код верен и у вас есть ошибка компилятора.

Возможно, вы можете обойти это, настроив Шаблон-параметр сами, хотя это будет зависеть от ошибки.

1

По вопросам рекламы [email protected]