Funktion eines Templates benutzen



  • Hallo,

    Der Linker findet einfach nicht die Definition des Destruktors deiner Klasse. Die muss auch mit in den Header.
    siehe auch
    http://www.c-plusplus.net/forum/39467



  • Braunstein schrieb:

    Hallo,

    Der Linker findet einfach nicht die Definition des Destruktors deiner Klasse. Die muss auch mit in den Header.
    siehe auch
    http://www.c-plusplus.net/forum/39467

    Dank Dir!
    Das ist ja echt blöd.

    Ich habe nun ein weiteres Problem mit den Teplates! Und zwar habe ich eine Klasse Pair mit 2 template Klassen und die Operator== Funktion will nicht funktionieren.

    template<class T_1, class T_2>
    class Pair
    {
    public:
    	Pair(const T_1& first, const T_2& second) : first(first), second(second) {};
    	friend bool operator== (const Pair<T_1,T_2>&, const Pair<T_1,T_2>&);
    private:
    	T_1 first;
    	T_2 second;
    };
    

    Etwas weiter unten im Header ist die Operator== Methode definiert.

    Trotzdem bekomme ich immer die Fehlermeldung

    error LNK2001: Nicht aufgelöstes externes Symbol ""bool __cdecl operator==(class Pair<class Coordinate,class Coordinate> const &,class Pair<class Coordinate,class Coordinate> const &)

    Was mache ich denn nun?



  • Etwas weiter unten im Header ist die Operator== Methode definiert.

    Bloss nicht herzeigen.

    Wobei... ich weiss gar nicht ob das geht. Also extern (ausserhalb der Klasse) definiert.
    Definier den friend einfach in der Klasse.



  • hustbaer schrieb:

    Etwas weiter unten im Header ist die Operator== Methode definiert.

    Bloss nicht herzeigen.

    Wobei... ich weiss gar nicht ob das geht. Also extern (ausserhalb der Klasse) definiert.
    Definier den friend einfach in der Klasse.

    Sorry.

    Das hier steht nun in der Klasse

    bool operator== (const Pair<T_1,T_2>& p_2)
    	{
    	if (get_first() == p_2.get_first())
    		if (get_second() == p_2.get_second())
    			return true;
    	if (get_second() == p_2.get_first())
    		if (get_first() == p_2.get_second())
    			return true;
    	return false;
    	};
    

    Und gibt Fehler C2678.

    Habe aber gerade die Signatur in

    bool operator== (const Pair<T_1,T_2>& p_2) const
    

    geändert und es compiliert.
    (Wusste gar nicht, dass Operator-Methoden const sein müssen!!!)

    Hoffentlich funktioniert das auch.

    Also ich muss schon sagen. Ich habe noch nie eine Programmiersprache kennen gelernt, die so verworren ist... Das ärgert mich.



  • Ein Operator muß im Allgemeinen nicht konstant sein. Und wenn du den Vergleich sowieso über das öffentliche Interface definierst, braucht er noch nicht einmal ein Member der Klasse sein.



  • ichbineinnoob schrieb:

    Habe aber gerade die Signatur in

    bool operator== (const Pair<T_1,T_2>& p_2) const
    

    geändert und es compiliert.
    (Wusste gar nicht, dass Operator-Methoden const sein müssen!!!)

    Vielleicht sind static oder friend angemessener als const.



  • Mit friend definieren und nicht nur deklarieren.

    template<class T_1, class T_2>
    class Pair
    {
    public:
        Pair(const T_1& first, const T_2& second) : first(first), second(second) {};
        friend bool operator== (const Pair<T_1,T_2>& a, const Pair<T_1,T_2>& b)
        {
           return a.first==b.first && a.second==b.second;
        }
    private:
        T_1 first;
        T_2 second;
    };
    

    Lustigerweise definiert man so eine Funktion, die außerhalb der Klasse lebt. Schon ein wenig plemplem.

    Aber klappt, und macht viel Ärger weg. Lehrbücher können das normalerweise nicht. Für die ist friend nur als Deklaration möglich. Ich bin nichtmal sicher, daß es erlaubt ist, ich weiß nur, daß es es gerne so mache. Vor allem bei Templates.



  • Aber friend funktioniert irgendwie nicht! Siehe oben.

    Erst als ich die Methode in die Klasse geschoben habe, hat es kompiliert.

    Und bei static bekomme ich folgende Meldung:

    error C2801: "Pair<T_1,T_2>::operator ==" muss ein nicht statischer Member sein.

    Vielleicht habe ich einfach etwas falsch programmiert? Aber ich kann nun schlecht meinen gesamten Code hier einfügen. Bin saufroh, dass es überhaupt kompiliert. Muss es später mal ausprobieren.



  • volkard hat doch eh schon gezeigt wie es geht.
    Was verwendest du denn für einen Compiler? Ist der vielleicht ... ziemlich alt und/oder verbuggt?



  • hustbaer schrieb:

    volkard hat doch eh schon gezeigt wie es geht.
    Was verwendest du denn für einen Compiler? Ist der vielleicht ... ziemlich alt und/oder verbuggt?

    Das war wohl seine Antwort auf 22:56, wo ich es noch nicht gezeigt hatte.


Anmelden zum Antworten