using-Direktive vs. using-Deklarationstausch in C ++
Bitte beziehen Sie sich auf den Code unten:
#include <algorithm>
namespace N
{
template <typename T>
class C
{
public:
void SwapWith(C & c)
{
using namespace std; // (1)
//using std::swap; // (2)
swap(a, c.a);
}
private:
int a;
};
template <typename T>
void swap(C<T> & c1, C<T> & c2)
{
c1.SwapWith(c2);
}
}
namespace std
{
template<typename T> void swap(N::C<T> & c1, N::C<T> & c2)
{
c1.SwapWith(c2);
}
}
Wie oben beschrieben, wird der Code in Visual Studio 2008/2010 nicht kompiliert. Der Fehler ist:
'void N::swap(N::C<T> &,N::C<T> &)' : could not deduce template argument for 'N::C<T> &' from 'int'.
Wenn ich jedoch (1) auskommentiere und (2) auskommentiere, wird es in Ordnung kompiliert. Was ist der Unterschied zwischenusing namespace std
undusing std::swap
das erklärt dieses Verhalten?