2012-04-10 10 views
14

Używam wersji beta programu Visual Studio 11 i jestem ciekawy błędu kompilacji, przechodzę do przechowywania obiektu std :: function w mojej klasie.Czy C++ 11 std :: function ogranicza liczbę argumentów, które może mieć wskaźnik funkcji?

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

W mojej klasie mam,

MyCallback m_callback; 

To kompiluje dobrze. Jeśli dodaję jeszcze jeden argument do listy, to się nie powiedzie.

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

Niepowodzenie jest:

>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 

Jest to dynamicznie powiązane biblioteki, która przygotowuje się do przekazywania danych do innej aplikacji. Mogę na pewno przerobić format danych, aby można było go przekazywać z mniejszą liczbą argumentów, ale zastanawiałem się, dlaczego widzę ten limit?

Przełączanie z powrotem do funkcji wskaźnik c stylu,

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

wydaje się działać prawidłowo.

Odpowiedz

37

Ten limit jest ustalany przez implementację w Visual Studio.

Specyfikacja C++ dla std::function nie ustanawia żadnego limitu. std::function używa szablonów variadic do pracy z dowolną liczbą argumentów. Implementacje mogą mieć ograniczenia oparte na np. Limitach zagnieżdżania instancji szablonu, ale powinny być duże. Specyfikacja sugeruje 1024 jako dobrą minimalną obsługiwaną głębokość zagnieżdżenia, a 256 jako dobre minimum dla argumentów dozwolonych w jednym wywołaniu funkcji, na przykład.

Visual Studio (od VS11) nie ma szablonów variadic. Symulują je do 5 argumentów w VS11, ale można to zmienić na maksymalnie 10. Wykonaj to, definiując w projekcie _VARIADIC_MAX. Może to znacznie wydłużyć czas kompilacji.

Aktualizacja: CTP VS 2012 Nov dodaje obsługę szablonów variadic, ale biblioteka standardowa nie została jeszcze zaktualizowana, aby z nich korzystać. Po zaktualizowaniu powinieneś być w stanie używać tylu argumentów ile chcesz z std::function.

+1

Prawidłowa odpowiedź. Zobacz także [Magic && Secrets] (http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11-Magic-Secrets) autorstwa samego STL na GoingNative 2012, wspomina o tym raz lub dwa razy. – Xeo

+0

Interesujące rzeczy. Pamiętam, że wdrażanie szablonów variadic było tylko niewielkim wysiłkiem po stronie g ++. –

+0

Doskonale, że odpowiada na moje pytanie, dzięki! – BZor

Powiązane problemy