【发布时间】:2020-01-03 18:22:04
【问题描述】:
我在namespace a 中定义了这些数据和运算符:
namespace a {
enum class E {
VALUE
};
std::ostream& operator<<(std::ostream& os, const E e)
{
return os << "VALUE";
}
}
我的代码在namespace b 中运行,它想使用另一个operator<< 来表示相同的类型,替换原来在namespace a 中定义的那个:
namespace b {
std::ostream& operator<<(std::ostream& os, const a::E e)
{
return os << "value";
}
void f()
{
const auto e = a::E::VALUE;
std::cout << e << std::endl;
}
}
int main()
{
b::f();
return 0;
}
由于 ADL,编译器会感到困惑,并将对 operator<< 的调用视为模棱两可的调用,因为 namespace a 和 namespace b 版本都可用。
当用户代码在 namespace b 内时,我怎样才能让它使用我的 operator<< 版本而没有歧义?
【问题讨论】:
-
不能帮助自己,但要注意不是编译器会感到困惑,而是它做了“正确的事情”,它不是你所期望的;)。它必须是
operator<<,还是命名函数也可以? -
@foreknownas_463035818 with function 更容易指定要使用的函数的哪个重载,这就是为什么我将问题放在运算符重载方面,即使问题是相同的:即使使用函数,我不想每次都指定使用哪个重载,我只想指定一次。
-
真正的答案是只有命名空间
a有“权利”为a::E类型定义规范operator<<。命名空间b中的operator<<应更改为命名函数。
标签: c++ namespaces operator-overloading argument-dependent-lookup