Si prega di fare riferimento al codice qui sotto:direttiva using vs utilizzando dichiarazione di swap in 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);
}
}
Come scritto sopra, il codice non viene compilato in Visual Studio 2008/2010. L'errore è:
'void N::swap(N::C<T> &,N::C<T> &)' : could not deduce template argument for 'N::C<T> &' from 'int'.
Tuttavia, se io commento (1) e togliere i commenti (2), si compilerà OK. Qual è la differenza tra using namespace std
e using std::swap
che spiega questo comportamento?
Questo sembra essere un problema di ambito. La regola è (se non sbaglio) che utilizzerà sempre l'ambito più locale prima. Quindi userà 'N :: swap' invece di' std :: swap' anche se si 'usa namespace std' – andre
Btw, il codice è mal formato e il programma ha un comportamento indefinito. Non è possibile aggiungere template di funzioni * overload * allo spazio dei nomi 'std', solo specializzazioni. –
Inoltre, come funziona questo swap, per quanto posso dire che è un ciclo infinito. – andre