Tôi đang lưu trữ SpiderMonkey trong một dự án hiện tại và muốn có chức năng template tạo ra một số phương pháp get/set tài sản đơn giản, ví dụ:Có phải các tham số không kiểu C++ tới các mẫu (hàm) được đặt hàng không?
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;
}
sử dụng:
::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}
};
này hoạt động tốt, tuy nhiên, nếu tôi thêm một loại thành viên khác:
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;
}
Sau đó Visual C++ 9 cố gắng sử dụng trình bao bọc JSObject * cho các thành viên 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
Đáng ngạc nhiên, việc nhả JSObject * phát sinh lỗi phân tích cú pháp! (bất ngờ '(') .Đây có thể là lỗi VC++ (bất kỳ ai có thể kiểm tra "template void foo() {}" biên dịch trong GCC?). Lỗi tương tự với "typedef JSObject * PObject; ..., PObject TClassImpl :: mem> ", void, struct Undefined *, và double. Kể từ khi sử dụng chức năng được khởi tạo đầy đủ:" & ReadProp ", sẽ không có hàm ngữ nghĩa quá tải bình thường vào chơi, nó là hàm được xác định tại điểm đó và được . ưu tiên hơn chức năng template có vẻ như mẫu đặt hàng được không đây
Vec2 chỉ là:.
class Vec2
{
public:
int32 x, y;
Vec2(JSContext* cx, JSObject* obj, uintN argc, jsval* argv);
static ::JSClass s_JsClass;
static ::JSPropertySpec s_JsProps[];
};
JSPropertySpec được mô tả trong liên kết jsapi trong OP, lấy từ đầu er:
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;
};
Điều này có vẻ như: '( Bất cứ ai đặt một lỗi trong Connect chưa? –
Tôi muốn đọc thông qua spec trước khi nộp hồ sơ này trong Connect. Tuy nhiên, tìm hiểu xem VC++ là sai từ thông số sẽ không nhỏ. Có thể đăng lên comp.whatever-it-is.C++ để xem một trong số họ có thể là luật sư ngôn ngữ và đăng chương và câu không? – DrPizza
Vâng, tôi đã có nghĩa là nhìn thấy nếu đây là một vấn đề knowen (hóa ra nó là). Tiếng anh của tôi là xấu. https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362170 –