ich habe mal wieder eine absurde Idee gehabt. Ich habe einen eigenen Typ struct Vektor3D { int x, y, z; } definiert. Und ich dachte mir, ich könnte ganz garstig per Template Specialization std::min() und max() überladen, so dass es elementweise mit meinem Typ arbeitet. Das sieht im Code so aus:
Code: Alles auswählen
namespace std
{
template <>
Vektor3D min( const Vektor3D& a, const Vektor3D& b) { return Vektor3D( min( a.x, b.x), min( a.y, b.y), min( a.z, b.z)); }
}
Edit1: Eigentrottel, erster Akt: Vektor3D lag in einem anderen namespace, aber die Spezialisierung muss ich ja im std::namespace definieren. Expliziter Namespace vor jedem Typnamen und jetzt lautet die Fehlermeldung: "template-Argument für const _ty& konnte nicht von Logik::Vektor3D hergeleitet werden". Gibt es eine Methode, den Typ sauber zu spezifizieren?
Edit2: Ich glaube, std::min liefert eine const reference zurück, während ich ja ein neues Objekt zurückgebe. Aber das müsste nach meinem Verständnis egal sein, dass bei der Funktionsüberladung der Rückgabewert ja nicht zur Funktionssignatur gehört und ich den demzufolge ändern können müsste.
Edit3: sorry, manchmal bin ich etwas voreilig beim Beten zu den C++-Gottheiten. Das Problem ist ganz simpel zu lösen, indem ich einfach auf jeden template-Kram verzichte und die Funktionen als einfache Überladungen stehen lasse. So sieht das dann aus:
Code: Alles auswählen
namespace std
{
Vektor3D min( const Vektor3D& a, const Vektor3D& b) { return Vektor3D( min( a.x, b.x), min( a.y, b.y), min( a.z, b.z)); }
}