Si consideri il seguente codice:Un difetto nelle regole di risoluzione di sovraccarico C++?
#include <iostream>
namespace ns1
{
struct A
{
};
template <class T>
std::ostream& operator << (std::ostream& os, const T& t)
{
return os << "ns1::print" << std::endl;
}
}
namespace ns2
{
template <class T>
std::ostream& operator << (std::ostream& os, const T& t)
{
return os << "ns2::print" << std::endl;
}
void f (const ns1::A& a)
{
std::cout << a;
}
}
int main()
{
ns1::A a;
ns2::f (a);
return 0;
}
compilazione fallisce con "l'errore di sovraccarico ambiguo" secondo la norma.
Ma perché? Sicuramente l'operatore "ugualmente buono" nello spazio dei nomi "casa" di A dovrebbe avere la precedenza? C'è qualche ragione logica per non farlo?
Perché pensi che le funzioni nello spazio dei nomi "casa" di 'A' dovrebbero avere la precedenza sulle funzioni nello spazio dei nomi della funzione chiamante' f' stessa? Non c'è modo di aggirare questo essere ambiguo. Un errore è l'unica cosa sensata. –
Perché chi ha creato più spazio dei nomi sa come deve essere stampato A? – cppalex
Prima di tutto, sono modelli. Se la persona che ha creato 'A' desiderava garantire un determinato comportamento per la stampa di oggetti di tipo' A', avrebbe fornito un sovraccarico o una specializzazione. Questo avrebbe risolto l'ambiguità qui. In secondo luogo, gli spazi dei nomi possono essere aperti e chiusi più volte, quindi la funzione potrebbe non essere stata fornita dall'implementatore di 'A'. –