Я бы хотел перегрузить std :: swap в моем классе шаблона. В следующем коде (упрощенно)
#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
есть ошибка компилятора (только в VS 2010):
error C2668: 'std::swap' : ambiguous call to overloaded
Я не знаю, почему, std :: swap должен быть перегружен ... Использование кода g ++ работает отлично. Без шаблонов (т.е. Point2D не является классом шаблонов) этот код также работает ..
Спасибо за вашу помощь.