Rozważmy następujący kod:Usterka w zasadach dotyczących przeciążenia 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;
}
Kompilacja nie powiedzie się z „błąd przeciążenia niejednoznacznym”, jak na standard.
Ale dlaczego? Z pewnością "równie dobry" operator w przestrzeni nazw "A" powinien mieć pierwszeństwo? Czy istnieje jakiś logiczny powód, aby tego nie robić?
Dlaczego według Ciebie funkcje w przestrzeni nazw 'A' home powinny mieć pierwszeństwo przed funkcjami w przestrzeni nazw funkcji wywołującej' f'? Nie ma sposobu, aby to było niejednoznaczne. Błąd jest jedyną rozsądną rzeczą. –
Bo kto stworzył niż przestrzeń nazw wie lepiej, jak należy wydrukować A? – cppalex
Przede wszystkim są szablonami. Jeśli osoba, która utworzyła "A", chciała zapewnić pewne zachowanie dla drukowania obiektów typu "A", zapewniłaby albo przeciążenie, albo specjalizację. To rozwiązałoby tu niejednoznaczność. Po drugie, przestrzenie nazw można wielokrotnie otwierać i zamykać, więc funkcja ta mogła nie zostać dostarczona przez implementatora 'A'. –