请考虑以下代码:
#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;
}
按照标准,编译会出现“模棱两可的重载错误”。
但是为什么?毕竟 A 命名空间中“同样好”的运算符应该具有优先权吧?难道没有逻辑上的理由吗?
A
命名空间中的函数应该优先于调用函数f
的名称空间中的函数呢?这种情况不可避免地会产生歧义。报错是唯一明智的选择。 - Cody GrayA
的人想要确保打印类型为A
的对象的某种行为,他们将提供重载或专门化。这将解决此处的歧义。其次,命名空间可以多次打开和关闭,因此该函数甚至可能不是A
的实现者提供的。 - Cody Gray