2016-01-18 9 views
2

I'am пытается создать контейнер как с индексом и ключ доступа с уникальными ключами: так вот мой код:повышение :: multi_index_container с random_acces и hashed_unique

#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(); 
} 

Когда я пытаюсь скомпилировать его у меня есть error boost_1_55_0 \ boost \ functional \ hash \ extensions.hpp: 269: error: C2664: 'size_t boost :: hash_value (std :: type_index)': не может преобразовать аргумент 1 из 'const QString' в 'std :: type_index' Оператор без пользовательского преобразования, который может выполнить это преобразование, или оператор не может называться

Как я могу видеть boos t не знает ничего, кроме класса Qt QString, но я не могу найти, как исправить эту проблему. Может кто-нибудь объяснить, как исправить мой код?

ответ

1

Вы должны указать Boost как хэш QString.

Простейший способ может показаться:

namespace boost { 
    template <> struct hash<QString> { 
     size_t operator()(QString const& v) const { 
      return 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(); 
}