Multi_index Container
Hi all, I am newbie to Boost library. I am trying to use multi_index_container library in my project. The problem I have at my hands needs One Hash index and one ordered indexed. I refer the Boost tutorial and Advance topic and tried to write the following snippet. But when I compiled it gives compilation error. I searched lot of different options and tried to fix it but I could not able to do it so. If you can guide me how to shut the compilation errors it will be great. If anyone of you is having any decent example tried out for Hash having ordered indexes please send it to me so I can go through and build my logic on top of that.... Code Follows. I am using MSVC SP6 on Win XP . /*****************************************/ #define BOOST_MULTI_INDEX_CHECK_INVARIANT #include <boost/config.hpp> #include <boost/multi_index_container.hpp> #include <boost/multi_index/member.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/hashed_index.hpp> #include <algorithm> #include <iostream> #include <iterator> #include <string> using boost::multi_index_container; using namespace boost::multi_index; struct employee { int id; std::string name; int ssnumber; employee(int id,const std::string& name,int ssnumber): id(id),name(name),ssnumber(ssnumber){} bool operator<(const employee& e)const{return id<e.id;} }; struct id{}; struct name{}; struct ssnumber{}; typedef multi_index_container< employee, indexed_by< // sort by employee::operator< ordered_unique<tag<id>,BOOST_MULTI_INDEX_MEMBER(employee,int,id) >, // sort by less<string> on name ordered_non_unique<tag<name>,BOOST_MULTI_INDEX_MEMBER(employee,std::stri ng,name) >, // hashed on ssnumber hashed_unique<tag<ssnumber>,BOOST_MULTI_INDEX_MEMBER(employee,int,ssnumb er) >
employee_set;
void main() { employee_set es; typedef employee_set::index<employee_set,ssnumber>::type employee_set_by_ssn; es.insert(employee(1,"aashit",323)); es.insert(employee(3,"chetan",443)); employee_set_by_ssn& ssn_index=es.get<2>(); } --------------------Configuration: MyHash - Win32 Debug-------------------- Compiling... main.cpp f:\practice\multiindex_examples\myhash\main.cpp(53) : error C2039: 'index<class boost::multi_index::multi_index_container<struct employee,struct boost::multi_index::indexed_by<struct boost::multi_index::ordered_unique<struct boost::multi_index::tag< struct id,struct boost::mpl::na,struct boost::mpl::na>,struct boost::multi_index::member_offset<struct employee,int,0>,struct boost::mpl::na>,struct boost::multi_index::ordered_non_unique<struct boost::multi_index::tag<struct name,struct boost::mpl: :na,struct boost::mpl::na>,struct boost::multi_index::member_offset<struct employee,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,4>,struct boost::mpl::na>,struct boost::multi_index::hashed_unique<struct boo st::multi_index::tag<struct ssnumber,struct boost::mpl::na,struct boost::mpl::na>,struct boost::multi_index::member_offset<struct employee,int,20>,struct boost::mpl::na,struct boost::mpl::na>,struct boost::mpl::na,struct boost::mpl::na>,class std::a llocator<struct employee> >,struct ssnumber>' : is not a member of 'multi_index_container<struct employee,struct boost::multi_index::indexed_by<struct boost::multi_index::ordered_unique<struct boost::multi_index::tag<struct id,struct boost::mpl::na, struct boost::mpl::na>,struct boost::multi_index::member_offset<struct employee,int,0>,struct boost::mpl::na>,struct boost::multi_index::ordered_non_unique<struct boost::multi_index::tag<struct name,struct boost::mpl::na,struct boost::mpl::na>,struc t boost::multi_index::member_offset<struct employee,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,4>,struct boost::mpl::na>,struct boost::multi_index::hashed_unique<struct boost::multi_index::tag<struct ssnu mber,struct boost::mpl::na,struct boost::mpl::na>,struct boost::multi_index::member_offset<struct employee,int,20>,struct boost::mpl::na,struct boost::mpl::na>,struct boost::mpl::na,struct boost::mpl::na>,class std::allocator<struct employee> >' f:\practice\multiindex_examples\myhash\main.cpp(53) : error C2146: syntax error : missing ';' before identifier 'employee_set_by_ssn' f:\practice\multiindex_examples\myhash\main.cpp(53) : error C2065: 'employee_set_by_ssn' : undeclared identifier f:\practice\multiindex_examples\myhash\main.cpp(60) : error C2065: 'ssn_index' : undeclared identifier f:\practice\multiindex_examples\myhash\main.cpp(60) : error C2039: 'get' : is not a member of 'multi_index_container<struct employee,struct boost::multi_index::indexed_by<struct boost::multi_index::ordered_unique<struct boost::multi_index::tag<struc t id,struct boost::mpl::na,struct boost::mpl::na>,struct boost::multi_index::member_offset<struct employee,int,0>,struct boost::mpl::na>,struct boost::multi_index::ordered_non_unique<struct boost::multi_index::tag<struct name,struct boost::mpl::na,s truct boost::mpl::na>,struct boost::multi_index::member_offset<struct employee,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,4>,struct boost::mpl::na>,struct boost::multi_index::hashed_unique<struct boost::m ulti_index::tag<struct ssnumber,struct boost::mpl::na,struct boost::mpl::na>,struct boost::multi_index::member_offset<struct employee,int,20>,struct boost::mpl::na,struct boost::mpl::na>,struct boost::mpl::na,struct boost::mpl::na>,class std::alloca tor<struct employee> >' f:\practice\multiindex_examples\myhash\main.cpp(60) : error C2059: syntax error : ')' Error executing cl.exe. main.obj - 6 error(s), 0 warning(s) A a s h i t
Hello Aashit, "Soni, Aashit" ha escrito:
Hi all,
I am newbie to Boost library. I am trying to use multi_index_container library in my project. The problem I have at my hands needs One Hash index and one ordered indexed. I refer the Boost tutorial and Advance topic and tried to write the following snippet. But when I compiled it gives compilation error. I searched lot of different options and tried to fix it but I could not able to do it so.
If you can guide me how to shut the compilation errors it will be great. If anyone of you is having any decent example tried out for Hash having ordered indexes please send it to me so I can go through and build my logic on top of that .
Code Follows.
I am using MSVC SP6 on Win XP .
This is primarily the problem: To make MSVC 6.0 compile a program using Boost.MultiIndex you've got to observe some stricter rules than in the normal case. Please read the section on MSVC 6.0 at http://boost.org/libs/multi_index/doc/compiler_specifics.html#msvc_60
typedef employee_set::index<employee_set,ssnumber>::type employee_set_by_ssn;
Problem #1: MSVC 6.0 does not support the "index" nested typedef. Instead, write typedef index<employee_set,ssnumber>::type employee_set_by_ssn;
employee_set_by_ssn& ssn_index=es.get<2>();
Problem #2: MSVC 6.0 does not support the get member function, use the global version instead: employee_set_by_ssn& ssn_index=get<2>(es); With these changes, and also tweaking /Zm and /ZI (as explained in the aforementioned section), your program compiles. Bare in mind that your compiler is very old and broken and making Boost.MultiIndex work for it can be quite a challenge, although it is doable. Good luck with your project, Joaquín M López Muñoz Telefónica, Investigación y Desarrollo
participants (2)
-
Joaquín Mª López Muñoz
-
Soni, Aashit