2016-09-19 99 views
-3

當我嘗試創建的這個對象,問題進行的boost :: multi_index

typedef boost::multi_index_container< 
ClassX*,                     //mapped value 
boost::multi_index::indexed_by<             //list of indices  
    boost::multi_index::hashed_unique<               
     boost::multi_index::const_mem_fun<ParentClassOfX, Key1, &ParentClassOfX::getKey1>    //hashed index by unique Key1 
    >, 
    boost::multi_index::hashed_unique<   
     boost::multi_index::const_mem_fun<ParentClassOfX, Vs64, &ParentClassOfX::getKey2>    //hashed index by unique Key1 
    > 
> 
>ClassXMultiKeyIndexed; 

一樣,

ClassXMultiKeyIndexed sample; 

並插入這樣一個指針,

ClassX *a; 
ClassXMultiKeyIndexed sample; 

//a is not NULL and is filled up before the below insert 
sample.insert(a); 

這是編譯錯誤,如果「sample.insert(a)」被註釋掉,它會編譯好。

編譯錯誤:

Compiling... 
. 
. 
. 
xtyab.cpp 
c:\code\common\lib\boost\boost\detail\allocator_utilities.hpp(153) : error  C2061: syntax error : identifier 'p' 
      c:\code\common\lib\boost\boost\multi_index\detail\index_base.hpp(105) : see  reference to function template instantiation 'void boost::detail::allocator::construct<Container*>(void *,const Type &)' being compiled 
    with 
    [ 
     Type=Container * 
    ] 
    c:\code\common\lib\boost\boost\multi_index\detail\index_base.hpp(102) : while compiling class template member function 'boost::multi_index::detail::hashed_index_node<Super,Category> *boost::multi_index::detail::index_base<Value,IndexSpecifierList,Allocator>::insert_(Container *const &,boost::multi_index::detail::hashed_index_node<Super,Category> *&,boost::multi_index::detail::lvalue_tag)' 
    with 
    [ 
     Super=boost::multi_index::detail::hashed_index_node<boost::multi_index::detail::index_node_base<Container *,std::allocator<Container *>>,boost::multi_index::detail::hashed_unique_tag>, 
     Category=boost::multi_index::detail::hashed_unique_tag, 
     Value=Container *, 
     IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Key1,DBObject::getKey1>>,boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Vs64,DBObject::getKey2>>>, 
     Allocator=std::allocator<Container *> 
    ] 
    c:\code\common\lib\boost\boost\multi_index\hashed_index.hpp(93) : see reference to class template instantiation 'boost::multi_index::detail::index_base<Value,IndexSpecifierList,Allocator>' being compiled 
    with 
    [ 
     Value=Container *, 
     IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Key1,DBObject::getKey1>>,boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Vs64,DBObject::getKey2>>>, 
     Allocator=std::allocator<Container *> 
    ] 
    c:\code\common\lib\boost\boost\multi_index\hashed_index.hpp(93) : see reference to class template instantiation 'boost::multi_index::detail::hashed_index<KeyFromValue,Hash,Pred,SuperMeta,TagList,Category>' being compiled 
    with 
    [ 
     KeyFromValue=boost::multi_index::const_mem_fun<DBObject,Vs64,DBObject::getKey2>, 
     Hash=boost::hash<boost::long_long_type>, 
     Pred=std::equal_to<__int64>, 
     SuperMeta=boost::multi_index::detail::nth_layer<2,Container *,boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Key1,DBObject::getKey1>>,boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Vs64,DBObject::getKey2>>>,std::allocator<Container *>>, 
     TagList=boost::mpl::vector0<boost::mpl::na>, 
     Category=boost::multi_index::detail::hashed_unique_tag 
    ] 
    c:\code\common\lib\boost\boost\multi_index_container.hpp(100) : see reference to class template instantiation 'boost::multi_index::detail::hashed_index<KeyFromValue,Hash,Pred,SuperMeta,TagList,Category>' being compiled 
    with 
    [ 
     KeyFromValue=boost::multi_index::const_mem_fun<DBObject,Key1,DBObject::getKey1>, 
     Hash=boost::hash<boost::long_long_type>, 
     Pred=std::equal_to<__int64>, 
     SuperMeta=boost::multi_index::detail::nth_layer<1,Container *,boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Key1,DBObject::getKey1>>,boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Vs64,DBObject::getKey2>>>,std::allocator<Container *>>, 
     TagList=boost::mpl::vector0<boost::mpl::na>, 
     Category=boost::multi_index::detail::hashed_unique_tag 
    ] 
    c:\code\common\src\biz\model\stm-stow_model\stm_container_manager_abc.h(323) : see reference to class template instantiation 'boost::multi_index::multi_index_container<Value,IndexSpecifierList>' being compiled 
    with 
    [ 
     Value=Container *, 
     IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Key1,DBObject::getKey1>>,boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<DBObject,Vs64,DBObject::getKey2>>> 
    ] 
Build log was saved at "file://c:\code\win\Debug\obj\BuildLog.htm" 
ProjABC - 1 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

編譯器點,以提高 謝謝!

+2

請提供一個[MCVE](http://stackoverflow.com/help/mcve),而不是帶有不可知類的代碼片段。 –

+0

語法錯誤是你輸入'p'的地方,編譯器不知道它。 – sehe

回答

0

錯誤消息c:\code\common\lib\boost\boost\detail\allocator_utilities.hpp(153) : error C2061: syntax error : identifier 'p'意味着您修改了boost源,可能是不知情的。

+0

不,我沒有.. – quickdraw

+0

@Ram可以肯定的是,只用'#include 編譯一個空的源文件。 –

+0

@MaximEgorushkin:這可能不會證明任何事情,因爲模板在使用之前不會被實例化。 –

0

這不太可能是一個提升多索引容器的問題,你沒有提供太多的細節,但下面的代碼是基於你的方法,應該編譯好。在你的編譯器上試試它 - 一旦你向自己證明了自己,然後比較不同並修復它。

#include <iostream> 

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

using boost::multi_index_container; 
using boost::multi_index::indexed_by; 
using boost::multi_index::hashed_unique; 
using boost::multi_index::tag; 

using namespace std; 

struct foo { 
    int id_a; 
    int id_b; 
    int get_id_a() const { 
     return id_a; 
    } 
    int get_id_b() const { 
     return id_b; 
    } 
}; 

struct tag_a {}; 
struct tag_b {}; 

using foo_container = boost::multi_index_container< 
foo*, 
indexed_by< 
    hashed_unique<tag<tag_a>, BOOST_MULTI_INDEX_CONST_MEM_FUN(foo, int, get_id_a)>, 
    hashed_unique<tag<tag_b>, BOOST_MULTI_INDEX_CONST_MEM_FUN(foo, int, get_id_b)> 
> 
>; 

int main() { 
    foo_container c; 
    foo f1{1, 2}; 
    foo f2{2, 3}; 
    c.insert(&f1); 
    c.insert(&f2); 

    { 
     auto it = c.get<tag_a>().find(1); 
     if (it != c.get<tag_a>().end()) { 
      cout << (*it)->id_a << ' ' << (*it)->id_b << endl; 
     } 
    } 
    { 
     auto it = c.get<tag_b>().find(3); 
     if (it != c.get<tag_b>().end()) { 
      cout << (*it)->id_a << ' ' << (*it)->id_b << endl; 
     } 
    }  
}