2012-04-10 28 views
14

Tôi đang sử dụng Visual Studio 11 beta và tôi tò mò về một lỗi biên dịch tôi nhận được lưu trữ một đối tượng std :: function trong lớp của tôi.Có C++ 11 std :: function giới hạn số đối số mà một con trỏ hàm có thể có?

typedef std::function<void (int, const char*, int, int, const char*)> MyCallback; 

Trong lớp của tôi, tôi có,

MyCallback m_callback; 

này biên dịch tốt. Nếu tôi thêm một đối số nữa vào danh sách thì nó không thành công.

typedef std::function<void (int, const char*, int, int, const char*, int)> MyCallback; 

Sự thất bại là:

>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(535): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>' 
1>   with 
1>   [ 
1>    _Tx=void (int,const char *,int,int,const char *,int) 
1>   ] 
1>   f:\development\projects\applications\my.h(72) : see reference to class template instantiation 'std::function<_Fty>' being compiled 
1>   with 
1>   [ 
1>    _Fty=void (int,const char *,int,int,const char *,int) 
1>   ] 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(536): error C2504: 'type' : base class undefined 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>' 
1>   with 
1>   [ 
1>    _Tx=void (int,const char *,int,int,const char *,int) 
1>   ] 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2146: syntax error : missing ';' before identifier '_Mybase' 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

Đây là một thư viện liên kết động mà đang chuẩn bị dữ liệu để chuyển cho ứng dụng khác. Tôi chắc chắn có thể làm lại định dạng của dữ liệu để nó có thể được thông qua với ít đối số hơn, nhưng tôi đã tự hỏi tại sao tôi thấy giới hạn này?

Switching trở lại c kiểu con trỏ hàm,

typedef void (*MyCallback)(int, const char*, int, int, const char*, int); 

dường như làm việc tốt.

Trả lời

37

Giới hạn này được đặt bởi việc triển khai trong Visual Studio.

Đặc tả C++ cho std::function không đặt bất kỳ giới hạn nào. std::function sử dụng các mẫu variadic để làm việc với bất kỳ số lượng đối số nào. Việc triển khai có thể có giới hạn dựa trên, ví dụ: giới hạn lồng khuôn mẫu instantiation, nhưng nó phải lớn. Đặc tả gợi ý 1024 là độ sâu lồng nhau được hỗ trợ tối thiểu tốt, và 256 là mức tối thiểu tốt cho các đối số được cho phép trong một cuộc gọi hàm, ví dụ.

Visual Studio (tính đến VS11) không có mẫu variadic. Họ mô phỏng chúng lên đến 5 đối số trong VS11, mặc dù bạn có thể thay đổi nó lên đến 10. Làm điều này bằng cách xác định _VARIADIC_MAX trong dự án của bạn. Điều này có thể tăng thời gian biên dịch rất nhiều.

Cập nhật: VS 2012 tháng mười một CTP thêm hỗ trợ cho các mẫu variadic, nhưng thư viện chuẩn chưa được cập nhật để sử dụng chúng. Sau khi được cập nhật, bạn có thể sử dụng nhiều đối số theo ý muốn với std::function.

+1

Câu trả lời đúng. Ngoài ra, hãy xem [Magic && Secrets] (http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11-Magic-Secrets) của STL tại GoingNative 2012, anh ấy đề cập đến điều này một hoặc hai lần. – Xeo

+0

Điều thú vị. Tôi nhớ việc triển khai các mẫu variadic chỉ là một nỗ lực nhỏ trên phía g ++ của mọi thứ. –

+0

Tuyệt vời, câu trả lời cho câu hỏi của tôi, Cảm ơn! – BZor

Các vấn đề liên quan