Funktion in Template später bestimmen



  • Hallo zusammen,

    also ich habe folgende Nachfrage. Ich möchte mir einen Algorithmus schreiben,
    der je nach Datentyp, der übergeben wird noch zusätzlich etwas ausführen soll.
    Ich verdeutliche das einfach mal mit einer init-Funktion:

    #include <iostream>
    
    template<typename T>
    void init(T& t){
            std::cout << "no init" << std::endl;
    }
    
    template <typename T>
    void doSomething(T& t){
            init(t);
            // do some further stuff
    }
    
    class A{
    
    };
    
    void init(A& t){
            std::cout << "init my A object" << std::endl;
    }
    
    int main(){
            A a;
            doSomething(a);
            return 0;
    }
    

    Die Ausgabe ist

    init my A object

    Wenn ich das gleiche für std::string mache:

    #include <iostream>
    #include <string>
    
    template<typename T>
    void init(T& t){
            std::cout << "no init" << std::endl;
    }
    
    template <typename T>
    void doSomething(T& t){
            init(t);
            // do some further stuff
    }
    
    void init(std::string& t){
            std::cout << "init my string" << std::endl;
    }
    
    int main(){
            std::string a("test");
            doSomething(a);
            return 0;
    }
    

    Lautet meine Ausgabe:

    no init

    Kann mir jemand erklären warum?

    Sobald ich die Funktion

    void init(std::string& t);
    

    vor

    template <typename T>
    void doSomething(T& t)
    

    deklariere, ist die Ausgabe:

    init my string

    Warum muss ich die Funktion im ersten Fall nicht vorher deklarieren und
    bei std::string doch?

    EDIT: i686-apple-darwin10-g++-4.2.1

    Gruß,
    CSpille



  • Da bisher noch keine Antwort kam, frag ich mal vorsichtig:

    Mit vorheriger Deklaration ist aber die korrekte Wahl der Funktion garantiert, oder?



  • Dein Compiler hat wohl in den sauren Apfel gebissen. Hab greade dein Code in VS2008 und 2010 getest und die Ausgabe ist.

    init my string



  • Liegt wohl am User.



  • Zeus schrieb:

    Dein Compiler hat wohl in den sauren Apfel gebissen. Hab greade dein Code in VS2008 und 2010 getest und die Ausgabe ist.

    init my string

    argh...
    Das macht mich noch skeptischer ^^
    Danke dir!

    asss schrieb:

    Liegt wohl am User.

    Aaah...
    Dann sagt er bei dir wohl immer

    no init

    🙄



  • Der gcc in der Version 4.0.1 liefert noch

    init my string

    Die Versionen 4.2.1, 4.3.5 und 4.4.4 liefen

    no init



  • Ich kann mal meine VM anschmeissen und ein Linux GCC nutzen.

    Ausgabe ist:

    no init


Anmelden zum Antworten