использование директивы против использования декларации 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 что объясняет такое поведение?

Ответы на вопрос(3)

Ваш ответ на вопрос