использование директивы против использования декларации swap в C ++
Пожалуйста, обратитесь к коду ниже:
#include
namespace N
{
template
class C
{
public:
void SwapWith(C & c)
{
using namespace std; // (1)
//using std::swap; // (2)
swap(a, c.a);
}
private:
int a;
};
template
void swap(C & c1, C & c2)
{
c1.SwapWith(c2);
}
}
namespace std
{
template void swap(N::C & c1, N::C & c2)
{
c1.SwapWith(c2);
}
}
Как написано выше, код неКомпилировать на Visual Studio 2008/2010. Ошибка:
'void N::swap(N::C &,N::C &)' : could not deduce template argument for 'N::C &' from 'int'.
Однако, если я закомментирую (1) и раскомментирую (2), он скомпилируется нормально. В чем разница междуusing namespace std
а такжеusing std::swap
что объясняет такое поведение?