هي C++ غير نوع المعلمات (وظيفة) قوالب أمرت ؟
-
02-07-2019 - |
سؤال
أنا استضافة وspidermonkey في المشروع الحالي و ترغب في الحصول على وظائف القالب توليد بعض بسيطة الملكية طرق الحصول على/مجموعة, على سبيل المثال:
template <typename TClassImpl, int32 TClassImpl::*mem>
JSBool JS_DLL_CALLBACK WriteProp(JSContext* cx, JSObject* obj, jsval id, jsval* vp)
{
if (TClassImpl* pImpl = (TClassImpl*)::JS_GetInstancePrivate(cx, obj, &TClassImpl::s_JsClass, NULL))
return ::JS_ValueToInt32(cx, *vp, &(pImpl->*mem));
return JS_FALSE;
}
المستخدمة:
::JSPropertySpec Vec2::s_JsProps[] = {
{"x", 1, JSPROP_PERMANENT, &JsWrap::ReadProp<Vec2, &Vec2::x>, &JsWrap::WriteProp<Vec2, &Vec2::x>},
{"y", 2, JSPROP_PERMANENT, &JsWrap::ReadProp<Vec2, &Vec2::y>, &JsWrap::WriteProp<Vec2, &Vec2::y>},
{0}
};
هذا يعمل بشكل جيد ، ومع ذلك ، إذا قمت بإضافة عضو آخر نوع:
template <typename TClassImpl, JSObject* TClassImpl::*mem>
JSBool JS_DLL_CALLBACK WriteProp(JSContext* cx, JSObject* obj, jsval id, jsval* vp)
{
if (TClassImpl* pImpl = (TClassImpl*)::JS_GetInstancePrivate(cx, obj, &TClassImpl::s_JsClass, NULL))
return ::JS_ValueToObject(cx, *vp, &(pImpl->*mem));
return JS_FALSE;
}
ثم Visual C++ 9 محاولات استخدام JSObject* المجمع int32 أعضاء!
1>d:\projects\testing\jswnd\src\main.cpp(93) : error C2440: 'specialization' : cannot convert from 'int32 JsGlobal::Vec2::* ' to 'JSObject *JsGlobal::Vec2::* const '
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>d:\projects\testing\jswnd\src\main.cpp(93) : error C2973: 'JsWrap::ReadProp' : invalid template argument 'int32 JsGlobal::Vec2::* '
1> d:\projects\testing\jswnd\src\wrap_js.h(64) : see declaration of 'JsWrap::ReadProp'
1>d:\projects\testing\jswnd\src\main.cpp(93) : error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'JSPropertyOp'
1> None of the functions with this name in scope match the target type
من المستغرب ، parening JSObject* حدوث خطأ في التحليل!(غير متوقع '(').وربما هذا هو VC++ خطأ (يمكن لأي شخص أن اختبار "قالب الفراغ فو() {}" يجمع في دول مجلس التعاون الخليجي؟).نفس الخطأ مع "الرموز المميزة ل typedef JSObject* PObject;..., PObject TClassImpl::mem>" باطلة, ، البنية غير معروف* و مزدوج.لأن وظيفة الاستخدام الكامل مثيل:"&ReadProp" ، ينبغي أن يكون هناك أي وظيفة طبيعية الزائد دلالات القادمة في اللعب ، بل هو وظيفة محددة في نقطة و يحصل على الأولوية على قالب وظائف.يبدو القالب يأمر هو الفشل هنا.
Vec2 فقط:
class Vec2
{
public:
int32 x, y;
Vec2(JSContext* cx, JSObject* obj, uintN argc, jsval* argv);
static ::JSClass s_JsClass;
static ::JSPropertySpec s_JsProps[];
};
JSPropertySpec هو موضح في JSAPI الرابط في العملية المتخذة من الرأس:
typedef JSBool
(* JS_DLL_CALLBACK JSPropertyOp)(JSContext *cx, JSObject *obj, jsval id,
jsval *vp);
...
struct JSPropertySpec {
const char *name;
int8 tinyid;
uint8 flags;
JSPropertyOp getter;
JSPropertyOp setter;
};
المحلول
متأكد VC++ و "المسائل" هنا.كومو و g++ 4.2 على حد سواء سعيدة مع البرنامج التالي:
struct X
{
int i;
void* p;
};
template<int X::*P>
void foo(X* t)
{
t->*P = 0;
}
template<void* X::*P>
void foo(X* t)
{
t->*P = 0;
}
int main()
{
X x;
foo<&X::i>(&x);
foo<&X::p>(&x);
}
VC++ 2008SP1, ومع ذلك, هو وجود شيء من ذلك.
ليس لدي الوقت لقراءة من خلال معيار لمعرفة بالضبط ما...ولكن أعتقد VC++ في الخطأ هنا.
نصائح أخرى
حاول تغيير JSObject * إلى آخر نوع مؤشر لمعرفة ما إذا كان يستنسخ خطأ.هو JSObject محددة عند نقطة الاستخدام ؟ أيضا ربما JSObject* يجب أن يكون في parens.
أنا بالتأكيد لا قالب المعلم, ولكن هل هذا تختزل إلى حالة خفية من يحاول التفريق الزائدة يستند بحتة على عودة النوع ؟
منذ C++ لا تسمح الحمولة الزائدة من الوظائف على أساس نوع الإرجاع ، وربما نفس الشيء ينطبق على قالب المعلمات.