Это может быть задано раньше, но мне не повезло найти ответ ...понимание поиска оператора; какой компилятор прав?
У меня есть неупорядоченный контейнер (то есть хеш, мы будем называть его 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 ++.
Мне интересно, какой компилятор прав?
p.s. Я строю в режиме C++ 11, если это имеет значение.
Содержание * делаю * пункт. Нам понадобится настоящий сборник и сообщения об ошибках. – jrok
Хорошая идея, чтобы читатели SO догадывались о том, какой секретный код произвел неопределенное описание поведения. Я почти проголосовал за это. Я вижу, что, по крайней мере, 4 человека уже сделали это, поэтому я воздерживаюсь. –
@jrok, нет, на самом деле они этого не делают (на самом деле, пустая будет хорошо). Вопрос в том, что: «учитывая вышеизложенное, ожидается ли, что QHash, пытающийся использовать оператор == на паре Foo, найдет оператор, как он определен?». GCC думает «да». Кланг считает «нет». Я * не спрашиваю, как это исправить («не делай этого»/сделай оператор == общедоступным); Мне интересно, что правильно. – Matthew