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 immerno 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