Problem mit der Implementierung einer Template Klasse
-
Was ist test.h?
-
@SirRust sagte in Problem mit der Implementierung einer Template Klasse:
Bruch<int> test1(2,4); // Hier entsteht der fehler
Moin,
Wenn ich das richtig sehe, fehlt dir das include für deine Implementation des templates.
Also entweder die Implementation auch in das Header-File mitreinschreiben oder am
Ende des Headers deine Implementation includen.Inhaltlich solltest du in deinem Konstruktor erst deine Member besetzten bevor du mit ihnen arbeitest,
dein Vorzeichenwechsel ist so grad wenig sinnvoll
-
@manni66
Das ist eine Testklasse um da einfach mal ein paar werte rein zu schmeißen
die kann erstmal ignoriert werden
-
@deviloper Die fehlende Implementierung macht sich aber für gewöhnlich erst beim Linken bemerkbar. Er hat aber eine Compilerfehlermeldung erhalten. Trotzdem sollte das Problem auf jeden Fall behoben werden. Vielleicht gibt ja der Compiler nur eine blöde Fehlermeldung aus, denn die fehlende Implementierung ist auch das einzige, was ich so im Moment entdecke. Die Klasse scheint der Compiler ja zu kennen, denn sonst hätte er eine andere Fehlermeldung geschrieben.
-
@SirRust sagte in Problem mit der Implementierung einer Template Klasse:
@manni66
die kann erstmal ignoriert werdenDer gezeigte Code verursacht nicht die Fehlermeldung. Aber ist ja dein Problem...
-
@mgaeckler Evtl. ist die test.h doch spannend. Ggf wird durch den Code darin der Linker-Fehler behoben den wir hier vermissen.
-
@manni66 In der test.h stand nichts drinne ausser einer Klassen definition ohne attriubt oder Methoden deklaration.
@Alle Ich konnte Das Problem aber soweit lösen. Anscheinend mag der Compiler bei Template Funktionen den Header nicht sondern will direkt die Zuständige .cpp inkludiert haben wenn die Funktion des Headers ausgelagert sind. Jetzt funktioniert es aufjedenfall.
-
@SirRust sagte in Problem mit der Implementierung einer Template Klasse:
@manni66 In der test.h stand nichts drinne ausser einer Klassen definition ohne attriubt oder Methoden deklaration.
@Alle Ich konnte Das Problem aber soweit lösen. Anscheinend mag der Compiler bei Template Funktionen den Header nicht sondern will direkt die Zuständige .cpp inkludiert haben wenn die Funktion des Headers ausgelagert sind. Jetzt funktioniert es aufjedenfall.
Hi,
das war klar, Templatedefinitionen müssen im Header, da sonst der Compiler die Templateinstanz nicht erstellen kann. Nach meiner Erfahrung erhält man dann aber einen Linkerfehler, wenn man/frau das nicht macht. Bist Du Dir sicher, daß Du die richtige Fehlermeldung zitiert hast?
-
@mgaeckler sagte in Problem mit der Implementierung einer Template Klasse:
Bist Du Dir sicher, daß Du die richtige Fehlermeldung zitiert hast?
Es ist nicht die richtige. Die Meldung stammt von
//test1(2,4);
wenn es nicht auskommentiert ist.
-
@manni66 sagte in Problem mit der Implementierung einer Template Klasse:
Es ist nicht die richtige.
Immerhin wurde irgendeine Fehlermeldung angegeben. Das die mit dem gezeigten nichts zu tun hat, ist halt unsere Aufgabe das herauszufinden.
@SirRust sagte in Problem mit der Implementierung einer Template Klasse:
if(Nenner <0 || Zaehler <0) // Negativ durch Negtaiv ergibt Positiv
Ja, aber negativ durch positiv oder positiv durch negativ nicht.
-
Och, wenn wir schon bei solchen Problemen sind, dann finde ich auch
if(a == 0 || b == 0) { throw "Der Bruch 0/0 ist 0"; }
eine schöne Blüte. Erstmal ist 0/0 undefiniert und nicht 0. Zweitens wurde zuvor schon bei
if(b == 0)
geworfen - man hat hier also niemals 0/0 - und 0/n ist durchaus ein gültiger Bruch für n > 0.Und dann frage ich mich noch,
- warum
gcd
eine Member-Funktion ist - warum
normalisieren
zwei Parameter hat - und welche Brüche denn beim
normalisieren
Fehler werfen sollten (nicht: welche es hier tun)
- warum
-
Außerdem viel offensichtlicher:
throw
von char-Arrays ist … nicht so gut. Besser alsstd::string
(was aktiv gefährlich wäre, dastd::string
selber etwas werfen könnte), aber trotzdem nutzlos. Denn: Wie fängt man das?catch "Der Bruch 0/0 ist 0"
ginge schließlich nicht.catch (const char * exception)
ginge zwar, aber was macht man damit? Einen riesigen Fallunterscheidungsblock? Damit hatte man ja das Exceptionhandling ad absurdum geführt.
-
@wob sagte in Problem mit der Implementierung einer Template Klasse:
"Der Bruch 0/0 ist 0"
Haha. Wer hat das erfunden? Die Schweitzer?