C ++, перегрузка std :: swap, ошибка компилятора, VS 2010 - PullRequest
4 голосов
/ 03 января 2011

Я бы хотел перегрузить 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 не является классом шаблонов) этот код также работает ..

Спасибо за вашу помощь.

Ответы [ 3 ]

5 голосов
/ 03 января 2011

См. Как перегрузить std :: swap () . По сути, вам разрешено выполнять специализацию std :: swap, но не перегрузку.

Таким образом, можно создать определенную версию для определенного типа Point<> (скажем, Point<float>), но не для Point<T>.

2 голосов
/ 03 января 2011

Я знаю, что вы не спрашивали об этом, но, поскольку вы используете VC10, вы предоставляете конструктор перемещения и оператор присваивания перемещения должно сделать std::swap() оптимальным для вашего типа.

0 голосов
/ 03 января 2011

Причина его неоднозначности в том, что вы предоставили :: swap и std :: swap, а затем using 'd std :: swap. Теперь у вас есть оба: :: swap и std :: swap в глобальном пространстве имен. Таким образом, компилятор не знает, имеете ли вы в виду :: swap или std :: swap.

Однако, предоставив оператор / конструктор перемещения, вы сможете выполнять операции подкачки оптимально, реалистично.

...