Template Probleme
-
Hallo, ich habe zum Tet eine Klasse geschrieben, die 3 Werte hält.
Nun möchte ich für diese Klasse den + Operator definieren.#include <IOstream> using namespace std; template <class T> class Punkt3D { public: T x,y,z; public: Punkt3D(T x_,T y_, T z_):x(x_),y(y_), z(z_) { cout <<"Ich (Punkt3D) werde erzeugt \n"; } ~Punkt3D() { cout << "Ich (Punkt3D) werde gelöscht \n"; } void sag_was() { cout << "Meine Werte sind" << " "<<x << " " << y << " " << z <<"\n"; } }; //Hier ist das Problem, da das T undefiniert ist Punkt3D<T> operator + ( Punkt3D<T> p1,Punkt3D<T> p2) {return Punkt3D(p1.x+p2.x,p1.y+p2.y,p1.z+p2.z);}Allerdings habe ich nun das Problem, das ja außerhalb der Klasse das T vom Template nicht mehr definiert ist.
Wie löst man das problem?
-
den operator auch als template implementieren:
template<class T> Punkt3D<T> operator +(Punkt3D<T> p1, Punkt3D<T> p2) { return Punkt3D(p1.x+p2.x,p1.y+p2.y,p1.z+p2.z); }
-
und die Argumente bessert als konstante Referenzen übergeben.
-
Und den Rückgabetyp const machen!
Und dem Compiler eine NRVO ermöglichen!template<class T> const Punkt3D<T> operator +(const Punkt3D<T>& p1, const Punkt3D<T>& p2) { Punkt3D<T> result(p1.x + p2.x, p1.y + p2.y, p1.z + p2.z); return result; }
-
phalanx-fanboy schrieb:
Und dem Compiler eine NRVO ermöglichen!
Ist imho quatsch. RVO gibt es schon länger als NRVO und dürfte daher von Compilern sogar eher besser unterstützt werden.
-
phalanx-fanboy schrieb:
Und dem Compiler eine NRVO ermöglichen!
lol 
Und auf keinen Fall inline Code schreiben, um dem Linker seine Link Time Code Generation zu ermöglichen