AW: linux-l: C++ (templates, operator overloading)

Vogler, Hartmut Hartmut.Vogler at telekom.de
Mo Aug 2 12:17:29 CEST 1999


> ich hoffe das ist nicht OT, aber ich programmiere ja schließlich unter
> Linux mit egcs und Wipeout (danke für den Tip Michael :-) ).
> Folgendes Problem:
> Ich habe eine schöne Klasse genannt monom und weiß nicht, wie ich es
> machen
> muß, damit ich in der Header-Datei deklarierte Methoden in der .cc-Datei
> definieren kann. Ich schaffe es nur, daß sowohl main.cc als auch monom.cc
> ohne Fehlermeldung kompilieren. Will ich dann linken findet der Linker
> in main dann nicht die Definition in monom.cc.
> Ein weiteres Problem ist, daß ich nicht die Syntax rausfinde, mit der ich
> den <<-Operator überladen kann.
> Damit das ganze etwas klarer wird, hier Auszüge aus meiner Source:
> 
> monom.h
> ----------------------------------------
> #include <iostream>
> template<class t_type>
> class monom {
> protected:
> 	int m_order;
> 	t_type m_coeff;
> public:
> 	inline monom(t_monom o, int c) { m_order=o; m_coeff=c; }
> 	void print();				// funktioniert nur, wenn
> ich es auch hier definiere
> 	??? operator<<(???);		// funktioniert gar nicht
> };
> 
> monom.cc
> ----------------------------------------
> #include "monom.h"
> template<class t_type>
> void monom<t_type>::print() {
> 	cout << m_coeff << "*x^" << m_order << endl;
> }
> 
> main.cc
> ----------------------------------------
> #include "monom.h"
> main() {
> 	monom<double> m(4., 5);
> 	m.print();
> }
> 
> Wie gesagt, lasse ich den operator<<-Kram erstmal raus, kompiliert alles,
> aber ich bekomme beim Linken die Fehlermeldung:
> 	"monom.h:8: undefined reference to 'monom<double>::print(void)`"
> Wohlgemerkt ist dies die Zeile des Konstruktors! Nehme ich die m.print();-
> Zeile aus main.cc heraus, geht es wieder!?!?
> 
> Was sagt mir das???
> 
Also interessant wäre dein makefile !

Du solltest doch erst mal *.o Dateien erzeugen, die du dann zu einer
executable zusammen linkst ?!

PS: Findest du es gut "<>" in Funktionsnamen zu verwenden ?



Mehr Informationen über die Mailingliste linux-l