• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Template die zweite: Klassen instanziieren

davidhigh

Newbie
Hallo nochmal,

im vorigen Post steht, wie man template Funktionen explizit instanziiert.
Nun bräuchte ich eine solche Instanziierung für Klassen:

Code:
\\class.h
template<typename T>
class MyClass{
...
void foo1();
}

\\class.cpp
template<typename T>
void foo1(){
...
}

Ansonsten gibts in main ne undefined reference to MyClass<int>::foo1().

Also:
(1) Wie deklariert man die Klasse explizit
(2) Muss man dann auch noch jede Funktion explizit deklarieren ? (Ich glaube ja nicht...)

Wäre nett, wenn ihr mir helfen könntet, ich sitz da jetzt nämlich schon wieder einen halben Tag davor und kann auch sonst im Netz nichts
Gescheites finden. Danke im Voraus,
Gruß, David
 

Tooltime

Advanced Hacker
Kleiner Buchtip dazu:
  • C++ von Stanley B. Lippman und Josee Lajoie,
    mitp ISBN 3-8266-1429-1, 2003

Code:
\\class.h
template<typename T>
class MyClass{
...
void foo1();
}

\\class.cpp
template<typename T>
void MyClass<T>::foo1(){
...
}

// Explizite Instanzdeklaration für Klassen
template class  MyClass<float>;
template class  MyClass<double>;
template class  MyClass<long double>;
 
OP
D

davidhigh

Newbie
Danke für die Antwort,

so habe ich das auch bereits probiert, es ergeben sich aber einige Fehlermeldungen, hauptsächlich
" 'foo' is not a member of 'MyClass<int>' "
und
" no matching function for call to 'foo<int>' "

Woran könnte das liegen ?

nochmal Frage (2):
Muss ich dazu noch jede Funktion einzeln explizit deklarieren ?
(Ich habs auch probiert, gibt aber ebenfalls Fehlermeldungen)

Danke nochmal,
Gruß David
 

Tooltime

Advanced Hacker
davidhigh schrieb:
Muss ich dazu noch jede Funktion einzeln explizit deklarieren ?
(Ich habs auch probiert, gibt aber ebenfalls Fehlermeldungen)
Nein.

Hast du gesehen das ich die Definition der Templatemethode umgeschrieben habe?
Statt
Code:
\\class.cpp
template<typename T>
void foo1(){
...
}
muss es
Code:
\\class.cpp
template<typename T>
void MyClass<T>::foo1(){
...
}
heißen. Es fehlt der Klassenname und wichtig, der Templatetyp ist Bestandteil des Klassennamen. Eine spezialisierte Variante der Methode für einen Typ würde dann so aussehen:
Code:
\\class.cpp
template<>
void MyClass<float>::foo1(){
...
}
 
Oben