首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost::multi_index_container与random_acces和hashed_unique

boost::multi_index_container与random_acces和hashed_unique
EN

Stack Overflow用户
提问于 2016-01-18 15:59:27
回答 1查看 478关注 0票数 2

我试图用唯一的键创建具有索引和键访问权限的容器:下面是我的代码:

代码语言:javascript
运行
复制
#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();
}

当我试图编译它时,我有一个错误boost_1_55_0\boost\functional\hash\extensions.hpp:269:错误: C2664:'size_t boost::hash_value(std::type_index)‘:无法将参数1从'const QString’转换为'std::type_index‘,没有用户定义的转换运算符可以执行此转换,否则不能调用运算符。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-18 16:33:14

您需要告诉Boost如何散列QString

最简单的方式似乎是:

代码语言:javascript
运行
复制
namespace boost {
    template <> struct hash<QString> {
        size_t operator()(QString const& v) const {
            return qHash(v);
        }
    };
}

完整的工作示例:

代码语言:javascript
运行
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34858976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档