std::vector aus Funktionspointern: wo hängts?!
-
Hallo zusammen.
Kein Problem liegt vor, nur einer formale Frage:Warum geht das hier:
#include <vector> class window { // "Prototyp" eines Callbacks für Events eines Fensters jeglicher Art bool (*dummy)(window*,UINT,WPARAM,LPARAM); // Nun den Vektor aus Funktionspointern std::vector< decltype(dummy) > m_vector; };ABER das nicht:
#include <vector> class window { // Nun den Vektor aus Funktionspointern std::vector< (bool (*dummy)(window*,UINT,WPARAM,LPARAM)) > m_vector; };Microsoft Visual Studio 2010 Express meckert bei der ersten runden Klammer: "Error: Es wurde ein Typspezifizierer erwartet"
Genereller Bug in MSVC oder ein Denkfehler von mir
?Mit freundlichen Grüßen:
Johannes Schneider
-
1. dummy ist ein unbekannter Bezeichner.
2. Typen dürfne nicht mit () umschlossen werden
-
bool (*dummy)(window*,UINT,WPARAM,LPARAM);Du hast eine Variable namens dummy, die ein Zeiger auf eine Funktion ist, die bool zurückgibt und die Parameter vom Typ window*, ..., LPARAM entgegennimmt.
std::vector< (bool (*dummy)(window*,UINT,WPARAM,LPARAM)) > m_vector;Hier hast du einen vector bestehend aus einer Variable namens dummy, die ... etc.etc.etc.
Du möchtest keinen Vektor aus Variablen, sondern aus Funktionszeigern. Also lass den Namen weg, dann hast du den reinen Typ:
std::vector< (bool (*)(window*,UINT,WPARAM,LPARAM)) > m_vector;
-
Alles klar!
Hier der Vollständigkeit halber noch die richtige Version:
#include <vector> class window { public: // Nun den Vektor aus Funktionspointern std::vector< bool(window*,UINT,WPARAM,LPARAM) > m_vector; };Vielen Dank
-
Ist das jetzt nicht ein Vektor basierend auf dem Funktionstyp (nicht Funktionszeiger-Typ?). Willst Du das?
-
std::vector<bool (*)(window*,UINT,WPARAM,LPARAM)> m_vector;So sollte es gehen. Der Grund ist einfach: Du schreibst ja auch nicht
std::vector<int i> m_vector;schöner ist es übrigens so:
typedef bool (*funcPtr)(window*,UINT,WPARAM,LPARAM); std::vector<funcPtr> m_vector;
-
Cyres schrieb:
schöner ist es übrigens so:
typedef bool (*funcPtr)(window*,UINT,WPARAM,LPARAM); std::vector<funcPtr> m_vector;Und eigentlich gemeint ist vermutlich
std::functionoderboost::signal.typedef std::function<bool (window*,UINT,WPARAM,LPARAM)> funcPtr;
-
Was auch geht ist natürlich
std::reference_wrapper(der, genau wiestd::function, auch einen Konvertierungsoperator und einenoperator()bereitstellt):std::vector< std::reference_wrapper< bool (window*,UINT,WPARAM,LPARAM) > > m_vector;