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.
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
Interessante Sache. Ich erinnere mich daran, variadische Templates implementiert zu haben, die nur eine kleine Anstrengung auf der Seite von g ++ waren. –
Ausgezeichnet, das beantwortet meine Frage, Danke! – BZor