C ++,重载std :: swap,编译错误,VS 2010

时间:2011-01-02 21:13:14

标签: c++ visual-studio-2010 overloading swap

我想在模板类中重载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应该被overoaded ...使用g ++代码可以很好地工作。没有模板(即Point2D不是模板类),这段代码也可以工作..

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

请参阅How to overload std::swap()。基本上,您可以对std :: swap进行专门化,但不能过载。

因此,可以为特定Point<>类型(例如Point<float>)创建特定版本,但不能为任何Point<T>创建。

答案 1 :(得分:2)

我知道你没有问过这个,但是因为你正在使用VC10,提供 移动构造函数 移动赋值运算符< / em> 应使std::swap()针对您的类型执行最佳操作。

答案 2 :(得分:0)

它不明确的原因是因为你提供了:: swap和std :: swap,那么你using'std :: swap。现在你在全局命名空间中同时拥有:: swap和std :: swap。所以编译器不知道你是指:: swap还是std :: swap。

但是,提供移动操作符/构造函数将使交换以最佳方式实现。