2012-10-08 18 views
0

我使用基於此example的Boost.MultiIndex進行了以下LRU實現。使用Boost MultiIndex作爲LRU緩存的C++索引排序問題

問題是,當我改變index_by部分的順序(和更新枚舉index_idx因此)我得到包含行錯誤:

cache_.insert(ci); 

用下面的診斷:

錯誤1個錯誤C2661: '升壓:: multi_index ::詳細:: sequenced_index ::插入' :無重載函數取1個參數C:\代碼\ code.cpp 79

的代碼如下:

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/tag.hpp> 
#include <boost/multi_index/member.hpp> 
#include <boost/multi_index/hashed_index.hpp> 
#include <boost/multi_index/sequenced_index.hpp> 

using namespace boost::multi_index; 

template <typename Key, typename T> 
class lru_cache 
{ 
private: 

    struct item_t 
    { 
     Key key; 
     T t; 
    }; 

    typedef boost::multi_index_container 
    < 
     item_t, 
     boost::multi_index::indexed_by 
     < 
     hashed_unique<boost::multi_index::member<item_t,Key,&item_t::key> >, 
     sequenced<> 
     > 
    > cache_t; 

    enum index_idx 
    { 
     e_map = 0, 
     e_seq = 1, 
    }; 

    cache_t cache_; 
    size_t max_cache_size_; 

public: 

    typedef typename std::pair<Key,T> item_pair_t; 

    lru_cache(size_t max_cache_size = 1) 
    : max_cache_size_(max_cache_size) 
    {} 

    bool find(const Key& key, T& t) 
    { 
     typename cache_t::nth_index<e_map>::type& hash_index = cache_.get<e_map>(); 
     auto itr = hash_index.find(key); 
     if (itr != hash_index.end()) 
     { 
     return false; 
     } 
     t = itr->t; 
     typename cache_t::nth_index<e_seq>::type& sequenced_index = cache_.get<e_seq>(); 
     auto itr2 = cache_.project<e_seq>(itr); 
     sequenced_index.relocate(itr2,sequenced_index.end()); 
     return true; 
    } 

    void insert(const Key& key, const T& t) 
    { 
     if (cache_.size() >= max_cache_size_) 
     { 
     typename cache_t::nth_index<e_seq>::type& sequenced_index = cache_.get<e_seq>(); 
     sequenced_index.erase(sequenced_index.begin()); 
     } 
     typename cache_t::nth_index<e_map>::type& hash_index = cache_.get<e_map>(); 
     auto itr = hash_index.find(key); 
     item_t ci = {key,t}; 
     if (itr == hash_index.end()) 
     cache_.insert(ci); // <--- Error here.... 
     else 
     hash_index.replace(itr,ci); 
    } 
}; 

int main() 
{ 
    typedef lru_cache<int,int> lru_cache_t; 
    lru_cache_t lc(2); 
    lc.insert(1,1); 
    int v; 
    lc.find(1,v); 
    return 0; 
} 

修改索引排序:

typedef boost::multi_index_container 
    < 
     item_t, 
     boost::multi_index::indexed_by 
     < 
     sequenced<>, 
     hashed_unique<boost::multi_index::member<item_t,Key,&item_t::key> > 
     > 
    > cache_t; 

    enum index_idx 
    { 
     e_map = 1, 
     e_seq = 0, 
    }; 
+3

也許最後定義的索引決定了插入,查找等東西的容器級方法? – Gerdiner

+0

@ iwr1132第一個。 –

回答

2

這是因爲有這個成員函數沒有這樣的過載! 請使用MultiIndex reference。 您可能的意思是cache_.insert(cache_.end(), ci);