Пожалуйста, обратитесь к ниже код:с помощью директивы против использования декларации своп в C++
#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);
}
}
Как написано выше, код не компилируется на Visual Studio 2008/2010. Ошибка:
'void N::swap(N::C<T> &,N::C<T> &)' : could not deduce template argument for 'N::C<T> &' from 'int'.
Однако, если я закомментировать (1) и раскомментировать (2), он будет компилировать OK. В чем разница между using namespace std
и using std::swap
, которая объясняет это поведение?
Это похоже на проблему с областью. Правило (если я не ошибаюсь), он всегда будет использовать самую локальную область. Поэтому он будет использовать 'N :: swap' вместо' std :: swap', даже если у вас есть 'using namespace std' – andre
Btw, код плохо сформирован, а программа имеет Undefined Behavior. Вы не можете добавить функциональные шаблоны * перегрузки * в пространство имен 'std', только специализации. –
Также, как это своп предположительно работает, насколько я могу судить, это бесконечный цикл. – andre