QSet не позволяет мне добавлять мои собственные типы

#qt #hash #set

#qt #хэш #установить

Вопрос:

Я использую QT, и у меня есть QSet, к которому я хочу добавить vtkSmartPointer<vtkImageData> . Мой синтаксис QSet<vtkSmartPointer<vtkImageData> > . Однако я получаю следующую ошибку компиляции.

 c:qt4.7.2includeqtcore....srccorelibtoolsqhash.h:880: error: C2665: 'qHash' : none of the 16 overloads could convert all the argument types
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(62): could be 'uint qHash(char)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(63): or       'uint qHash(uchar)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(64): or       'uint qHash(signed char)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(65): or       'uint qHash(ushort)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(66): or       'uint qHash(short)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(67): or       'uint qHash(uint)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(68): or       'uint qHash(int)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(69): or       'uint qHash(ulong)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(77): or       'uint qHash(long)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(78): or       'uint qHash(quint64)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(86): or       'uint qHash(qint64)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(87): or       'uint qHash(QChar)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(88): or       'uint qHash(const QByteArray amp;)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(89): or       'uint qHash(const QString amp;)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(90): or       'uint qHash(const QStringRef amp;)'
c:qt4.7.2includeqtcore../../src/corelib/tools/qhash.h(91): or       'uint qHash(const QBitArray amp;)'
  

при попытке сопоставить список аргументов ‘(const vtkSmartPointer)’
с

 [
    T=vtkImageData
]
  

Для меня это выглядит так, как будто я должен написать свою собственную функцию хеширования

  1. Это правильно?
  2. Если да, то как мне это сделать?
  3. Если нет, то что происходит?

Я новичок в QT, перешедший с Java, где мне никогда не приходилось беспокоиться о написании собственной хэш-функции.

Спасибо

Ответ №1:

Вы правы в том, что вам нужно написать свою собственную функцию хеширования для vtkSmartPointer класса, потому что Qt ее не предоставляет. Однако Qt предоставляет хэш-функцию для указателей ( qHash(const T *) ), так что вы могли бы попробовать что-то вроде этого:

 template<typename T>
uint qHash(const vtkSmartPointer<T> amp;p)
{
    return qHash(p.GetPointer());
}
  

Комментарии:

1. К чему это приведет? Гарантирует ли это, что два указателя, указывающие на разные данные, будут возвращать разные функции хеширования?

2. Вам нужно было бы иметь это определение доступным при объявлении вашего QSet<vtkSmartPointer<T> > . Таким образом, вы могли бы поместить его в тот же исходный файл, в который вы используете QSet , или в файл заголовка, если вам нужно использовать его из нескольких исходных файлов. Эта функция просто использует функцию QHash () Qt, которая вычисляет хэш на основе значения указателя. Qt — зрелая и хорошо протестированная библиотека, поэтому я уверен, что их функции хеширования работают.