Ich möchte std :: swap in meiner Template-Klasse überladen. Im folgenden Code (vereinfacht)C++, Überladen std :: swap, Compiler Fehler, VS 2010
#ifndef Point2D_H
#define Point2D_H
template <class T>
class Point2D
{
protected:
T x;
T y;
public:
Point2D() : x (0), y (0) {}
Point2D(const T &x_, const T &y_) : x (x_), y (y_) {}
....
public:
void swap (Point2D <T> &p);
};
template <class T>
inline void swap (Point2D <T> &p1, Point2D <T> &p2) { p1.swap (p2); }
namespace std
{
template <class T>
inline void swap (Point2D <T> &p1, Point2D <T> &p2) { p1.swap (p2); }
}
template <class T>
void Point2D <T>::swap (Point2D <T> &p)
{
using (std::swap);
swap (x, p.x);
swap (y, p.y);
}
#endif
gibt es einen Compiler-Fehler (nur in VS 2010):
error C2668: 'std::swap' : ambiguous call to overloaded
Ich weiß nicht, warum, std :: Swap overoaded werden soll ... Mit g ++ Code funktioniert perfekt. Ohne Vorlagen (d. H. Point2D ist keine Vorlagenklasse) funktioniert dieser Code auch.
Vielen Dank für Ihre Hilfe.
Sie sollen nicht ** std :: swapping ** überladen, Sie sollen ** es spezialisieren **. Antworten auf die von villintehaspam verbundene Frage erklären diese Unterscheidung zusammen mit dem Geben von Beispielen. Aber ** partielle Spezialisierung ** ist für Funktionsschablonen nicht möglich, daher müssen Sie Ihre Implementierung in Ihrem eigenen Namensraum definieren und sich auf Koenig-Lookup verlassen. –
Hinweis: Der Standard besagt "Eine explizite Spezialisierungserklärung darf keine Freundschaftsdeklaration sein". Es war eine nette Idee. –