2016-01-18 43 views
2

我'嘗試與這兩個指數和獨特的按鍵鍵訪問創建容器:所以這裏是我的代碼:的boost :: 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(); 
} 

當我嘗試編譯它,我有一個錯誤 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' 沒有可執行此轉換的用戶定義轉換運算符,或者不能調用運算符

正如我所看到的噓聲t不知道什麼abt 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(); 
} 
相關問題