【发布时间】:2015-02-17 03:22:42
【问题描述】:
我试图了解为什么以下代码无法编译:
namespace ns {
struct S {};
}
namespace alleq {
inline bool
operator==(const ns::S &, const ns::S &)
{
return true;
}
}
namespace ns {
using namespace alleq;
// using alleq::operator==; // Works if you uncomment this
}
ns::S a;
void
f()
{
::ns::operator==(a, a); // OK
a == a; // Error: no match for 'operator=='
}
函数f 的第一行确实编译,这让我相信命名空间ns 包含一个函数operator==。但是,当我比较ns::S 类型的两个值时,找不到此operator== 函数。相比之下,using 声明确实按预期工作,并允许 f 的第二行通过 ADL 找到 ns::operator==。
我怀疑原因与 using directive 应该使符号看起来像是在全局命名空间 :: 中的事实有关(因为这是命名空间alleq 和ns)。但如果真的是这样,那::ns::operator==为什么会找到函数呢?
更一般地说,我试图在库中提供一些有用的operator==(和相关)重载,但如果人们不想要它们,我不会强迫他们使用这些定义。我希望允许人们根据他们是否将专用的运算符命名空间导入到他们自己的命名空间来启用或不启用他们的类型的 operator== (和相关的其他运算符)。现在看起来人们可能不得不编写大量使用 declarations (我可以用宏来简化它,但是很糟糕)。
【问题讨论】:
-
听起来你正在尝试重新发明
std::rel_ops,这通常被视为失败的实验 -
@JonathanWakely 为什么失败了?你能给我参考一些解释问题的文章吗?
-
@JonathanWakely 非常感谢!
标签: c++ namespaces argument-dependent-lookup