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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage