LINUX.ORG.RU

QHash<__int128>

 , , ,


0

4

Как добавить поддержку __int128 в QHash не модифицируя «qhashfunctions.h»?

Если добавляю у себя в исходники qHash(__int128) выдает ошибку

call of overloaded ‘qHash(const __int128&)’ is ambiguous      Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))

если добавить в qhashfunctions.h, то работает


Ответ на: комментарий от RazrFalcon

main.cpp:

#include <QHash>

uint qHash(__int128)
{
  return 0;
}

int main()
{
  QHash<__int128, int>()[1] = 1;
}

если uint qHash(__int128) перенести в qhashfunctions.h, то компилириется.

Ower
() автор топика
Ответ на: комментарий от Ower

Обернуть в какой-нибудь namespace? Там в заголовках он есть, видимо, и просто сделан using или что-то ещё.

xaizek ★★★★★
()
Ответ на: комментарий от BRE

Так я об этом и говорил - разве это нормально, когда нужно подключать хедеры в определенном порядке? Разве это не костыль?

Ower
() автор топика
Ответ на: комментарий от Ower

Не надо подключать хедеры в определённом порядке. Он не знает, как темплейты работают.

anonymous
()
Ответ на: комментарий от anonymous

Я за него отвечу.
Чтобы функция была определена раньше, чем возникнет неоднозначность.

anonymous
()
Ответ на: комментарий от anonymous

Чтобы функция была определена раньше, чем возникнет неоднозначность.

Она и так определяется раньше.

Иди учи, когда происходит lookup для dependent-имён в темплейтах.

anonymous
()

Чёт я не пойму, что не так с __int128, потому что для обёртки над ним всё работает

#include <QHash>

struct wrapper { __int128 field; };
bool operator==(const wrapper& s1, const wrapper& s2) { return s1.field == s2.field; }

uint qHash(wrapper)
{
	return 0;
}

int main()
{
	wrapper s = { 1 };
	QHash<wrapper, int>()[s] = 1;
}

anonymous
()

Ну ладно, насчёт dependent name lookup я слегка ошибся, там всё не так просто, как я думал.

Для примитивных типов, видимо, придётся следить за порядком хедеров. Для непримитивных не обязательно.

anonymous
()
Ответ на: комментарий от anonymous

http://en.cppreference.com/w/cpp/language/dependent_name#Lookup_rules

As discussed in lookup, the lookup of a dependent name used in a template is postponed until the template arguments are known, at which time

  • non-ADL lookup examines function declarations with external linkage that are visible from the template definition context
  • ADL examines function declarations with external linkage that are visible from both the template definition context and the template instantiation context

(in other words, adding a new function declaration after template definition does not make it visible, except via ADL).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.