Je voudrais surcharger std :: swap dans ma classe de template. Dans le code suivant (simplifié)C++, surcharge de std :: swap, erreur du compilateur, 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
il y a une erreur de compilation (uniquement dans VS 2010):
error C2668: 'std::swap' : ambiguous call to overloaded
Je ne sais pas pourquoi, std :: swap doit être overoaded ... Utilisation Le code g ++ fonctionne parfaitement. Sans modèles (c'est-à-dire Point2D n'est pas une classe de modèle) ce code fonctionne également ..
Merci pour votre aide.
Vous n'êtes pas censé ** surcharger ** 'std :: swap', vous êtes censé ** le spécialiser **. Les réponses à la question liée à villintehaspam expliquent cette distinction en donnant des exemples. Mais ** spécialisation partielle ** n'est pas possible pour les modèles de fonction, vous devrez donc définir votre implémentation dans votre propre espace de nom et faire appel à la recherche Koenig. –
Note: la norme dit "Une déclaration de spécialisation explicite ne doit pas être une déclaration d'ami." C'était une bonne idée cependant. –