之前可能会问这个问题,但我没有运气找到答案......
我有一个无序的容器(即散列;我们将其称为 QHash,因为它是,尽管这可能发生在任何类似的情况下)需要一个比较运算符的键类型。
考虑以下:
// foo.h
class Bar
{
public:
class Foo {};
};
// foo.cpp
#include <QtCore/QHash>
namespace
{
typedef Bar::Foo Foo;
bool operator==(Foo const& a, Foo const& b) { return &a == &b; }
}
uint qHash(Foo const& foo) { return qHash(&foo); }
int main()
{
QHash<Foo, int> hash;
// do stuff with hash, e.g.:
hash.insert(Foo(), 5);
return 0;
}
使用 G++,一切都很好。然而,clang 在 qhash.h 的内部给出了一个关于
invalid operands to binary expression
的错误,其中试图在 ==
的实例上使用 Foo
。在我看来,clang 没有找到或拒绝匿名命名空间中 operator==
的定义,这可能是由于与 G++ 不同的查找规则。我想知道,哪个编译器是正确的?
附言我正在以 C++11 模式构建,以防万一。
最佳答案
好吧,ADL 查看定义类的命名空间。看
在
[basic.lookup.argdep]/2:
“对于函数调用中的每个参数类型 T,都有一组零
或更多关联的命名空间和一个
要考虑的零个或多个相关类的集合。的套
命名空间和类被确定
完全由函数参数的类型(以及
任何模板模板参数)。
用于指定类型的 Typedef 名称和 using 声明不
为这组做出贡献。”
注意最后一句话。
因此,对于原始示例, namespace 中的 typedef
接线员没有帮助,
gcc 是错误的,clang 是正确的。
关于c++ - 理解运算符查找;哪个编译器是正确的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26740071/