Funktionszeiger mit boost



  • Hallo

    Jeden Tag ein neues Probelm. So fühlt sich das derzeit bei mir an. Heute also folgendes: Ich versuche mich gerade mal wieder an Funktionspointer und dachte, da gibt es doch was bei boost. Also so sieht es aus:

    in Headerdatei als Memberavriable einer Klasse:

    boost::function<unsigned int(std::vector<Cube>& Cubes)> Func[13];
    

    in cpp-Datei:

    Func[0] = &Berechnungen::Einsen;
    

    Nun bekomme ich immer folgende Fehlermeldung:

    error LNK2019: unresolved external symbol "unsigned int __cdecl Berechnungen::Einsen(class std::vector<class Cube,class std::allocator<class Cube> > &)" (?Einsen@Berechnungen@@YAIAAV?vector@VCube@@V?vector@VCube@@V?allocator@VCube@@@std@@@std@@@Z) referenced in function "protected: void __thiscall Game::InitFunctionPoiter(void)" (?InitFunctionPoiter@Game@@IAEXXZ) Game.obj

    Das passiert ja eigentlich immer, wenn man vergisst eine lib einzubinden. Bloss welche ist das in diesem Fall und ist das wirklich der Fehler?

    chrische



  • Am einfachsten machst du es dir, indem du den angegebenen Namen auseinandernimmst - der Linker such die Methode "Einsen(vector<Cube>&)" der Klasse/Namensraum "Berechnungen".



  • Kenne boost gar nicht, aber was cpp angeht müßte die template-para liste so aussehen.

    boost::function<unsigned int,std::vector<Cube>& Cubes> Func[13];
    


  • Hallo

    Ich habe jetzt mal was probiert und so klappt es :

    using namespace Berechnungen;
    
    unsigned int Berechnungen::Einsen(std::vector<Cube>& Cubes)
    {
    	unsigned int Result = 0;
    	for(int i=0; i<5; ++i)
    		if(Cubes[i].Value() == 1)
    			Result += 1;
    	return Result;
    }
    

    so aber nicht:

    using namespace Berechnungen;
    
    unsigned int Einsen(std::vector<Cube>& Cubes)
    {
    	unsigned int Result = 0;
    	for(int i=0; i<5; ++i)
    		if(Cubes[i].Value() == 1)
    			Result += 1;
    	return Result;
    }
    

    chrische



  • Ähm..ich bin gerade sprachlos..

    ..also dass Berechnung::Einsen und Einsen nicht das selbe ist, ist ja wohl klar.
    Du musst Einsen schon im namespace Berechnung definieren.



  • Hallo

    dragon90# schrieb:

    Ähm..ich bin gerade sprachlos..

    ..also dass Berechnung::Einsen und Einsen nicht das selbe ist, ist ja wohl klar.
    Du musst Einsen schon im namespace Berechnung definieren.

    Ich habe meinen letzten Beitrag noch einmal editiert, weil ich die Codetags falsch gesetzt habe. Mir ist schon klar, dass Berechnen::Einsen und Einsen nicht dasselbe sind, aber ich schreibe ja explizit, dass ich den namespace Berechnen benutze und dachte, dass es dann reicht nur Einsen zu schreiben und er automatisch darauf kommt, dass ich die Einsen im namespace Berechenen meine. War das verständlich?

    chrische



  • Ähm, und wenn Du drei Namespaces benutzt? Soll dann "Einsen" in allen drein auftauchen?!

    Nein, Du musst die Funktion schon innerhalb des Namespaces deklarieren und definieren. Du kannst sie nicht innerhalb eines Namespace deklarieren, diesen dann benutzen und vom Compiler erwarten dass er Dir den Rest einsortiert.



  • Du hast zwei Möglichkeiten:

    //Möglichkeit 1
    void Berechnungen::Einsen()
    {
    }
    
    //Möglichkeit 2
    namespace Berechnungen
    {
      void Einsen()
      {
      }
    }
    

    anders geht es nicht



  • Hallo

    In Ordnung dann habe ich wieder was gelernt.

    Vielen Dank.

    chrische


Anmelden zum Antworten