argh - die fehlermeldung die ich posten wollte ist:
Code:
tmp/cc25BrVv.o: In function `foo<double>::bar()': main.cpp:(.text._ZN3fooIdE3barEv[foo<double>::bar()]+0x28): undefined reference to `foo<double>::myfunction(double&)' collect2: ld gab 1 als Ende-Status zurück
, aber ich kann den Fehler auch in der ursprünglichen Version nicht nachvollziehen. Vergessen, foo.cpp mit einzukompilieren? -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra
Dennoch hätte ich noch eine frage die mein problem beschreibt. Mir ist bei untigem code irgendwie klar dass ich zwar einen double foo typen haben und es halt keine spezialisierung frü fooy<int> gibt.
Doch wie kann ich innerhalb eine template-funktion abhängig vom Template-Typen in Template-spezialisierungen unterschiedlicher signatur springen? Muss ich wirklich für alle typen identische signatur-templates zur verfügung stellen die dann leer sind? so dummy template-spezialisierungen?
C++:
#include"foo.h"
// die main
int main(int argc, char** argv) { foo<double> fd; fd.bar();
return0; }
C++:
#include <iostream>
template <class T> class foo { public: void bar(); void myfunction(int& a, int& b); void myfunction(double& a); };
Zunächst mal: Es handelt sich hier nicht um eine Template-Funktion, sondern um eine Funktionsvorlage (template = Vorlage). Eine Funktionsvorlage ist keine Funktion, genau so wenig, wie eine Klassenvorlage eine Klasse ist.
Was deinen speziellen Fall angeht, ich vermute, dass du folgendes meinst:
Wenn du mit Templates arbeitest dann schreib alles in die Headerdatei, cpp's sind hier nicht sinnvoll. Wenn du umbedingt ne Aufspaltung in 2 Dateien machen willst, dann binde die cpp am Ende der Headerdatei ein, (direkt vor dem #endif).
Dein kompletter Code wird wahrscheinlich ungefähr so aussehen:
template<> void foo<int>::myfunction(int& a) { std::cout << "myfunction int"; }
template<> void foo<double>::myfunction(double& a) { std::cout << "myfunction double"; }
#endif
Jetzt kannst du aber nur foo's für in int oder double generieren, weil für alle anderen die Memberfunktion myfunction nicht definiert ist. Wenn du ne allgemeine Funktion definieren willst sieht das ungefähr so aus:
C++:
template<class T> void foo<T>::myfunction(T& a) { std::cout << "myfunction für alle nicht int und double"; T variable; // Deklaration einer Variable vom Typ T }