【发布时间】:2014-12-31 15:12:50
【问题描述】:
这可能以前被问过,但我没有找到答案......
我有一个无序容器(即哈希;我们将其称为 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 模式下构建,以防它有所作为。
【问题讨论】:
-
内容做很重要。我们需要一个实际的可编译示例和错误消息。
-
让 SO 读者猜测是什么密码产生了模糊描述的行为的好主意。我几乎为此投了赞成票。不过,我看到至少有 4 人已经这样做了,所以我弃权。
-
@jrok,不,他们真的没有(事实上,空的会很好)。问题是:“鉴于上述情况,是否期望 QHash 尝试在一对 Foo 上使用 operator== 会找到定义的运算符?”。 GCC 认为“是”。 Clang 认为“不”。我不询问如何解决它(“不要那样做”/使 operator== public);我想知道哪个是正确的。
-
...在有人告诉我之前我需要解释无序容器的概念... QHash (显然)是
<Key, Value>上的一个模板类,带有一个关联的帮助类QHashNode<Key, Value>成员Key key和方法(Key const& key0)执行key0 == key。 Clang barfs here,抱怨找不到合适的==。 -
嗯,
std::unordered_map有同样的问题吗?
标签: c++ templates namespaces operator-overloading