2012-04-10 4 views
14

Ich verwende die Betaversion von Visual Studio 11 und bin neugierig auf einen Kompilierungsfehler, den ich bekomme, ein std :: function-Objekt in meiner Klasse speichern.Steht C++ 11 std :: function die Anzahl der Argumente, die ein Funktionszeiger haben kann?

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

In meiner Klasse habe ich

MyCallback m_callback; 

Dies kompiliert just fine. Wenn ich der Liste ein weiteres Argument hinzufüge, schlägt es fehl.

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

Der Fehler ist:

>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 

Dies ist eine dynamisch verknüpfte Bibliothek, die Daten vorbereitet zu einer anderen Anwendung zu übergeben. Ich kann das Format der Daten sicherlich überarbeiten, so dass es mit weniger Argumenten übergeben werden kann, aber ich habe mich gefragt, warum ich dieses Limit sehe?

zur c-style Funktionszeiger,

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

scheint Zurückschalten zu funktionieren.

Antwort

37

Dieser Grenzwert wird von der Implementierung in Visual Studio festgelegt.

Die C++ Spezifikation für std::function gibt keine Grenze. std::function verwendet variadische Vorlagen, um mit einer beliebigen Anzahl von Argumenten zu arbeiten. Implementierungen können eine Grenze haben, die beispielsweise auf Schablonen-Instanziierungs-Verschachtelungsgrenzen basiert, aber sie sollte groß sein. Die Spezifikation schlägt 1024 als eine gute minimale unterstützte Verschachtelungstiefe und 256 als ein gutes Minimum für Argumente vor, die beispielsweise in einem Funktionsaufruf erlaubt sind.

Visual Studio (ab VS11) hat keine variadischen Vorlagen. Sie simulieren sie bis zu 5 Argumente in VS11, obwohl Sie sie bis zu 10 ändern können. Tun Sie dies, indem Sie _VARIADIC_MAX in Ihrem Projekt definieren. Dies kann die Kompilierungszeiten stark erhöhen.

Update: Das VS 2012 Nov CTP bietet Unterstützung für Variadic-Vorlagen, aber die Standardbibliothek wurde noch nicht aktualisiert, um sie zu verwenden. Sobald es aktualisiert wurde, sollten Sie in der Lage sein, mit std::function so viele Argumente wie gewünscht zu verwenden.

+1

Richtige Antwort. Siehe auch [Magic && Secrets] (http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11-Magic-Secrets) von STL selbst auf GoingNative 2012, er erwähnt dies ein- oder zweimal. – Xeo

+0

Interessante Sache. Ich erinnere mich daran, variadische Templates implementiert zu haben, die nur eine kleine Anstrengung auf der Seite von g ++ waren. –

+0

Ausgezeichnet, das beantwortet meine Frage, Danke! – BZor

Verwandte Themen