C++ boost::具有随机访问和哈希唯一的多索引容器

C++ boost::具有随机访问和哈希唯一的多索引容器,c++,boost,qt4,boost-multi-index,C++,Boost,Qt4,Boost Multi Index,我正在尝试创建一个容器,其中包含索引和具有唯一键的键访问:下面是我的代码: #include <QString> #include <boost/multi_index_container.hpp> #include <boost/multi_index/hashed_index.hpp> #include <boost/multi_index/random_access_index.hpp> #include <boost/multi_in

我正在尝试创建一个容器,其中包含索引和具有唯一键的键访问:下面是我的代码:

#include <QString>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/mem_fun.hpp>

class MyClass{
public:
    MyClass( const QString& name ): mName( name ){}
    QString name    ( ) const { return mName; }
    void    setName ( const QString& name ) { mName = name ;}
private:
    QString mName;
};


using namespace boost::multi_index;
typedef multi_index_container<
    MyClass,
    indexed_by<
        random_access<tag<struct RandomIndex>>,
        hashed_unique<
            tag<struct NameIndex>,
            const_mem_fun<MyClass, QString, &MyClass::name>
        >
    >
> Table;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Table table;
    for (MyClass v : { "first", "second", "third" }){
        table.push_back(v);
    }

    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
类MyClass{
公众:
MyClass(const QString&name):mName(name){}
QString名称()常量{return mName;}
void setName(const QString&name){mName=name;}
私人:
QString-mName;
};
使用名称空间boost::multi_索引;
typedef多索引容器<
我的班级,
索引<
随机存取,
哈希_唯一<
标签,
康斯特·梅姆·芬
>
>
>表;
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
表格;
对于(MyClass v:{“第一”、“第二”、“第三”}){
表.推回(v);
}
返回a.exec();
}
当我试图编译它时,我有一个错误 boost\u 1\u 55\u 0\boost\functional\hash\extensions.hpp:269:错误:C2664:'size\u t boost::hash\u value(std::type\u index)':无法将参数1从'const QString'转换为'std::type\u index' 没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符


正如我所看到的,boost对Qt类QString一无所知,但我找不到解决这个问题的方法。有人能解释一下如何修复我的代码吗?

你需要告诉Boost如何散列
QString

最简单的方法似乎是:

namespace boost {
    template <> struct hash<QString> {
        size_t operator()(QString const& v) const {
            return qHash(v);
        }
    };
}
namespace boost{
模板结构哈希{
size_t运算符()(QString常量和v)常量{
返回qHash(v);
}
};
}
完整的工作示例:

#include <QtCore/QString>
#include <QtCore/QHash>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/mem_fun.hpp>

class MyClass{
public:
    MyClass( const QString& name ): mName( name ){}
    QString name    ( ) const { return mName; }
    void    setName ( const QString& name ) { mName = name ;}
private:
    QString mName;
};

namespace boost {
    template <> struct hash<QString> {
        size_t operator()(QString const& v) const {
            return qHash(v);
        }
    };
}


using namespace boost::multi_index;
typedef multi_index_container<
    MyClass,
    indexed_by<
        random_access<tag<struct RandomIndex>>,
        hashed_unique<
            tag<struct NameIndex>,
            const_mem_fun<MyClass, QString, &MyClass::name>
        >
    >
> Table;

#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Table table;
    for (QString v : { "first", "second", "third" }){
        table.push_back(MyClass(v));
    }

    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
类MyClass{
公众:
MyClass(const QString&name):mName(name){}
QString名称()常量{return mName;}
void setName(const QString&name){mName=name;}
私人:
QString-mName;
};
名称空间提升{
模板结构哈希{
size_t运算符()(QString常量和v)常量{
返回qHash(v);
}
};
}
使用名称空间boost::multi_索引;
typedef多索引容器<
我的班级,
索引<
随机存取,
哈希_唯一<
标签,
康斯特·梅姆·芬
>
>
>表;
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
表格;
for(QString v:{“第一”、“第二”、“第三”}){
表.推回(MyClass(v));
}
返回a.exec();
}