K
Absolute_nooby schrieb:
Jetzt bin ich echt verwundert... In dem Programmcode von oben funktioniert das Compilen nun richtig (ich habe die Deklaration im Header und rufe eine Instanz auf).
Du meinst wahrscheinlich "Definition".
Absolute_nooby schrieb:
Nun habe ich aber eine weitere Klasse in der gleichen Header Datei, die sich einfach nicht richtig compilen lässt...
template<class Base> class C
{
public:
Base method()
{
h //kein Fehler?!
}
};
Aufrufen tue ich die Klasse auch:
C<Sample_Class> test;
Man ruft keine Klassen auf. Du instanziierst hier indirekt eine Spezialisierung eines Klassentemplates. Dabei werden aber nicht automatisch alle Elementfunktionen erzeugt. Das versucht der Compiler erst dann, wenn sie auch irgendwo benutzt werden:
test.method();
Spätestens hiermit sollte der Compiler Fehlermeldungen ausgeben. Dass er es nicht schon früher tut, ist aber wie gesagt ein schlechtes Zeichen bzgl Compiler-Qualität; denn, obwohl "Base" ja erstmal nur ein Platzhalter ist, kann ein guter Compiler den Funktionskörper trotzdem zumindest teilweise überprüfen -- also, ob syntaktisch alles richtig ist und ob Bezeichner (wie zB 'h'), die von den Template-Parametern nicht abhängen, gefunden werden können.
Folgendes ist aber korrektes C++ und kompiliert garantiert:
template<class T>
class foo {
int dings(T x) { return x.first; }
void bums() {}
}
int main()
{
foo<int> f;
f.bums();
}
Da foo<int>::dings nirgens aufgerufen wird, versucht der Compiler auch nicht die Funktion zu übersetzten. Syntaktisch ist das, was im Körper steht, aber korrekt und für T lässt sich etwas einsetzten, so dass "return x.first;" einen Sinn ergibt. C++ Templates != Java/C# Generics.
Tu Dir einen Gefallen und bestell Dir eines (oder mehr) der empfohlenen C++ Bücher. Also, erstmal die Sprache richtig lernen (siehe Beginner/Introductory-Abschnitt), dann Best Practices nachlesen (siehe Beginner/Best_Practices-Abschnitt) und wenn Dich dann Templates noch interessieren und Du den Anspruch hast, sie komplett zu verstehen, dann hol Dir noch "C++ Templates: The Complete Guide". Ich kann das nur wiederholen: Gescheite Bücher zu diesen Themen sind unersetzbar. C++ hast Du viel schneller "drauf" mit als ohne solche Bücher. Und Zeit ist Geld. Die Zeit, die Du damit sparst, ist viel teurer als der Preis der Bücher.
kk