QНе позволяйте мне добавлять свои типы - PullRequest
2 голосов
/ 08 апреля 2011

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

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

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

[
    T=vtkImageData
]

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

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

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

Спасибо

1 Ответ

2 голосов
/ 08 апреля 2011

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

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