Boost.Function mit Boost.Bind
-
Hallo,
ich habe eine CALLBACK-Funktion mittels den im Threadtitel genannten libs gebaut. Nur provoziert irgendein mir unbekannter Fehler, dass die vc90.pdb nicht geupdatet werden kann. Im Release-Build sieht die Geschichte dennoch wieder ganz anders aus. Wie dem auch sei, nun der Code.Es gibt 3 Klasse in einer hierarchischen Anordnung. Eine Hauptklasse, eine Unterklasse und eine Unterklasse von dieser Unterklasse.
Hauptklasse:
boost::bind ( &Network::AsyncTCPClient::StartTransfer )1. Unterklasse:
void NetworkManager::CheckIfServerConnected ( const boost::function<void (Network::AsyncTCPServer*)> &temp_CallbackStartTransfer ) { for(;;) { if(m_pClient->m_ConnectedToServer) { if(m_ReadyToPlay) temp_CallbackStartTransfer(m_pServer.get()); } } }2. Unterklasse, die die eigentliche zu call'ende-Funktion beinhaltet:
/// CALLBACK /// Starts transfer between client and server void StartTransfer() { Package002 package; SendData(package.m_pReadyToPlay, sizeof(package.m_pReadyToPlay)); }Ich stehe etwas auf dem Schlauch, deswegen würde ich mich über Hilfe freuen. Was habe ich falsch gemacht?
Ich danke im Voraus!
-
Kóyaánasqatsi schrieb:
[...]ich habe eine CALLBACK-Funktion mittels den im Threadtitel genannten libs gebaut. Nur provoziert irgendein mir unbekannter Fehler, dass die vc90.pdb nicht geupdatet werden kann[...]
Probier mal, alles neu zu bauen. Im schlimmsten Fall die pdb von Hand löschen. Das ist ein Problem (Bug), das vor allem bei MSVS 2008 ohne SP1 vor kommt.
Bei Deinem aufruf vonboost::bindscheint außerdem das Objekt zu fehlen, für das Du binden willst. Es sei denn, die Funktion ist statisch, oderNetworkundAsyncTCPClientsind namespaces. Aber das ist im gezeigten Code nicht zu sehen.
-
Ich hatte den Fehler schon öfters, deswegen hatte ich alles schon ausprobiert. Auch vn Hand hatte ich es schon versucht zu löschen. Und nein, keine Funktion ist statisch. Aber welches Objekt meinst du beim bost::bind?
-
"Das Objekt" (vom Typ Network::AsyncTCPServer*) ist der erste Parameter des Funktors. Damit musst Du bind allerdings auch sagen, dass Du einen Funktor mit einem Parameter erstellen willst.
bind( &Network::AsyncTCPClient::StartTransfer, _1 )
-
Und wenn StartTransfer weder unär noch binär ist... ?
-
Darum geht es nicht. Du hast in der Signatur temp_CallbackStartTransfer doch angegeben, dass der Funktor einen Parameter vom Typ AsyncTCPClient* nimmt. Dann musst Du bind auch mitteilen, dass ein Funktor mit einem Parameter erstellt werden soll. Der Parameter ist hier das this-Objekt.
bind( nonstatic_member, _1 )( xxx ) wird hier automagisch zu xxx->nonstatic_member()
Beispiel:
struct Test { void func(); }; Test thisTest; thisTest.func(); // thisTest links vom Punkt ist das this-Objekt. function< void ( Test* ) > functor = bind( &Test::func, _1 ); functor( &thisTest ); // hier ist thisTest in der Klammer das this-ObjektEDIT:
Ah, gerade gesehen, dass der Parameter vom Typ AsyncTCPServer und die Methode aus der Klasse AsyncTCPClient ist. Da passt aber irgendwas nicht. Zum einen fehlt, wenn StartTransfer nicht-statisch ist, dass zum Aufruf gehörende AsyncTCPClient-Objekt (das ist das, was Tachyon meinte), zum anderen passt die Signatur void (AsyncTCPServer*) nicht zu AsyncTCPClient::StartTransfer()Vielleicht fehlen auch einfach nur zu viele Informationen, um aus den Codeschnipseln eine sinnvolle Antwort zu bauen.