Binären und-operator überladen auf eine Vorlagen-Klasse
War ich vor kurzem versucht, um zu Messen, mein operator überladen/template Fähigkeiten und wie ein kleiner test, erstellt der Container-Klasse unten. Während dieser code kompiliert fein und funktioniert korrekt unter MSVC 2008 (zeigt 11), die beide MinGW/GCC und Comeau choke auf die operator+
überlastung. Als ich Ihnen Vertrauen mehr als MSVC, ich versuche, herauszufinden, was ich falsch mache.
Hier ist der code:
#include <iostream>
using namespace std;
template <typename T>
class Container
{
friend Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs);
public: void setobj(T ob);
T getobj();
private: T obj;
};
template <typename T>
void Container<T>::setobj(T ob)
{
obj = ob;
}
template <typename T>
T Container<T>::getobj()
{
return obj;
}
template <typename T>
Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs)
{
Container<T> temp;
temp.obj = lhs.obj + rhs.obj;
return temp;
}
int main()
{
Container<int> a, b;
a.setobj(5);
b.setobj(6);
Container<int> c = a + b;
cout << c.getobj() << endl;
return 0;
}
Dies ist der Fehler, Comeau gibt:
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 27: error: an explicit template argument list is not allowed
on this declaration
Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs)
^
1 error detected in the compilation of "ComeauTest.c".
Ich habe eine harte Zeit versucht zu bekommen Comeau/MingGW ball zu spielen, so dass ist, wo Wende ich mich an Euch. Es ist schon eine lange Zeit, da mein Gehirn geschmolzen ist, so viel unter dem Gewicht der C++ - syntax, also ich fühle mich ein wenig peinlich ;).
BEARBEITEN: Beseitigt eine (irrelevante) lvalue aufgelisteten Fehler in der anfänglichen Comeau dump.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich die Lösung gefunden Dank zu diesem forum posting. Im wesentlichen müssen Sie ein Funktionsprototyp, bevor Sie Sie verwenden können, 'Freund', auf die es innerhalb der Klasse, aber Sie müssen auch die Klasse deklariert werden, um richtig zu definieren, die die Funktion Prototyp. Also, die Lösung ist, haben zwei Prototyp-Definitionen (von der Funktion und der Klasse) an der Spitze. Der folgende code kompiliert werden, unter allen drei Compiler:
Hier die "<>" nach
operator+
sollte entfernt werden, da Sie nur deklarieren Sie eine neue Vorlage, die nicht spezialisiert eine Allgemeine eine. Auch mindestensg++
sehen will, der template-Deklaration vor der friend-Deklaration, so muss es verschoben werden, bevor die Erklärung derContainer
. Also folgende Reihenfolge der Deklarationen funktioniert:Diese gab ich einen Schuss unter GCC und habe es zu kompilieren und auszuführen mit ein paar änderungen. Es waren zwei änderungen, die ich hatte zu machen, um GCC glücklich.
War die Deklaration der friend-Vorlage-Funktion. Es ist eine eigene template-Deklaration separat von der Klasse eins, so habe ich U anstelle der Container-Klasse' T es. Ich habe auch losgeworden, die <> nach dem operator+. Ich glaube nicht, dass Sie brauchen diese, es sei denn, Sie schreiben eine template-Spezialisierung.
Beiden, die Linie
nicht Fliegen mit GCC, weil Sie Fragen zum speichern einer Referenz auf ein temporäres (Ergebnis der addition). Ich entfernte das kaufmännische und-Zeichen so, dass es einen Ort zum speichern des Ergebnisses.
Sah ich Ihren Beitrag erst jetzt, dass Sie auch funktioniert, da der forward-Deklaration. Ich denke, ich werde dies auf jeden Fall als eine alternative, die nicht von Ihnen verlangen. Natürlich habe ich nur getestet, GCC...
Du besser aus der Definition der Funktion direkt in die Klasse. Auch Sie sollten die übergabe der Parameter als
const
Referenzen.'operator+' ist nicht ein Mitglied die Funktion, und es ist nicht Vorlagen. Es ist nur den operator+, der nimmt die Vorlagen-Parameter.'