4

我是 Qt 的新手,正在学习处理 QHash 的工作原理。在使用此示例时,我不明白为什么这会引发错误。我可能会错过一些东西,但请指导我学习这一点。

主文件

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QHash<QString,Person> hash;
QString key="1";

Person p;
p.name = name;
p.number = an;

hash.insert(key,p); 

    return a.exec();
}

人.h

class Person
{
public:
    Person();
    Person(QString name,QString num);
    bool operator==(const Person & other) const; //== overloading to assign in QHash
    QString name,number;
};

个人.cpp

Person::Person()
{
}
Person::Person(QString name, QString num)
{
    this->name=name;
    this->number=num;
}
bool Person::operator==(const Person & other) const
{
    bool state;
    if (name == other.name )
        state = true;
    else
        state = false;

    return state;
}

错误是:-'qHash':17 个重载中没有一个可以转换所有参数类型。我知道我错过了一些东西。请指导我。

4

2 回答 2

6

你需要全局qHash()函数。

QHash 的键类型除了是可分配的数据类型之外还有其他要求:它必须提供 operator==(),并且类型的命名空间中还必须有一个 qHash() 函数,该函数返回键类型参数的哈希值.

有关详细信息,请参阅此内容。

于 2013-11-06T07:43:22.467 回答
0

您提供的代码不完整且不可编译 - 例如找不到符号名称,不包含。

当您将类用作值时,不需要 op ==。值类的唯一要求 - 默认构造函数。

我认为你的问题是别的。如果你提供了完整的代码和完整的错误列表,我可以告诉你究竟是什么。

您将在下面找到代码片段的工作版本。(为简单起见,所有内容都在一个文件中)

主文件

#include <QApplication>
#include <QHash>
#include <QString>

class Person
{
public:
    Person(QString name=QString::null,QString num=QString::null);
    QString name,number;
};


Person::Person(QString _name, QString _num)
:name(_name),number(_num)
{   
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QHash<QString,Person> hash;
    QString key="1";

    Person p("Orhan Kemal", "1914");

    hash.insert(key,p); 
        return a.exec();
}

问候, 瓦伦丁

编辑: 初始化的成员不在正文中

于 2013-11-06T11:55:08.667 回答