multi_index_container

Hi, using multi_index_container I've got strange errors. Simple source code leaned on official examples doesn't compile. Hardly modified code that seems to be equivalent does compile however. I've reduced it to two examples. I'm using Visual C++ .NET 7.09466 (i.e. cl.exe 13.00.9466) with boost 1.32.0 under Win XP. This first example is a shortened version of boost_1_32_0\libs\multi_index\example\basic.cpp. It reveals 4 subversions, but 2 of them only compile without erros. Why the other don't? 01 #include <boost/multi_index_container.hpp> 02 #include <boost/multi_index/member.hpp> 03 #include <boost/multi_index/ordered_index.hpp> 04 #include <string> 05 06 using boost::multi_index_container; 07 using namespace ::boost; 08 using namespace boost::multi_index; 09 10 11 struct employee 12 { 13 int id; 14 std::string name; 15 int age; 16 17 employee(int id_,std::string name_,int age_):id(id_),name(name_),age(age_){} 18 }; 19 20 21 struct id{}; 22 struct name{}; 23 struct age{}; 24 25 26 typedef multi_index_container< 27 employee, 28 indexed_by< 29 ordered_unique< 30 tag<id>, BOOST_MULTI_INDEX_MEMBER(employee,int,id)>, 31 ordered_non_unique< //remove for versions C, D 32 tag<name>,BOOST_MULTI_INDEX_MEMBER(employee,std::string,name)>, 33 ordered_non_unique< 34 tag<age>, BOOST_MULTI_INDEX_MEMBER(employee,int,age)> > 35 > employee_set; 36 37 38 //use exact one of following versions, remove the other lines 39 40 //version A: does NOT compile 41 //causes basic.cpp(42) : error C2976: 'boost::multi_index::index' : too few template arguments 42 typedef employee_set::index<id>::type employee_set_by_id; 43 44 //version B: DOES compile 45 typedef index<employee_set,id >::type employee_set_by_id; 46 typedef index<employee_set,age>::type employee_set_by_age; 47 48 //remove the name index (lines 31, 32) for following versions 49 50 //version C: DOES compile 51 typedef index<employee_set,id >::type employee_set_by_id;; 52 53 //version D: does NOT compile 54 //causes ...\include\boost-1_32\boost\mpl\vector\aux_\preprocessed\no_ctps\vector10.hpp(398) : 55 // error C2039: 'item3' : is not a member of 'boost::mpl::vector2<T0,T1>' 56 typedef index<employee_set,age>::type employee_set_by_age; My second example consists of 2 tiny programs. The former compile fine. Using the qualified name should do the same, but outputs ...\include\boost-1_32\boost\multi_index_container.hpp(60) : error C2039: 'multi_index_node_type' : is not a member of 'boost::detail' Where's the difference? 60 #include <boost/multi_index_container.hpp> 61 #include <boost/multi_index/ordered_index.hpp> 62 63 using boost::multi_index_container; 64 65 int main( int argc, char* argv[] ) 66 { 67 multi_index_container< int > mic; 68 return 0; 69 } 70 #include <boost/multi_index_container.hpp> 71 #include <boost/multi_index/ordered_index.hpp> 72 73 int main( int argc, char* argv[] ) 74 { 75 boost::multi_index_container< int > mic; 76 return 0; 77 } -- DSL Komplett von GMX +++ Superg�nstig und stressfrei einsteigen! AKTION "Kein Einrichtungspreis" nutzen: http://www.gmx.net/de/go/dsl

Hi Vokkerm thanks for trying Boost.MultiIndex! Volker Vieth ha escrito:
Hi,
using multi_index_container I've got strange errors. Simple source code leaned on official examples doesn't compile. Hardly modified code that seems to be equivalent does compile however. I've reduced it to two examples.
I'm using Visual C++ .NET 7.09466 (i.e. cl.exe 13.00.9466) with boost 1.32.0 under Win XP.
[...]
40 //version A: does NOT compile 41 //causes basic.cpp(42) : error C2976: 'boost::multi_index::index' : too few template arguments 42 typedef employee_set::index<id>::type employee_set_by_id;
Yes, this is a limitation with MSVC++ 6.0/7.0, see http://boost.org/libs/multi_index/doc/compiler_specifics.html#msvc_70
43 44 //version B: DOES compile 45 typedef index<employee_set,id >::type employee_set_by_id; 46 typedef index<employee_set,age>::type employee_set_by_age;
OK, fine.
47 48 //remove the name index (lines 31, 32) for following versions 49 50 //version C: DOES compile 51 typedef index<employee_set,id >::type employee_set_by_id;;
OK, too.
52 53 //version D: does NOT compile 54 //causes ...\include\boost-1_32\boost\mpl\vector\aux_\preprocessed\no_ctps\vector10.hpp(398) : 55 // error C2039: 'item3' : is not a member of 'boost::mpl::vector2<T0,T1>' 56 typedef index<employee_set,age>::type employee_set_by_age;
!! Here I'm missing somethig... Isn't version D exactly the same as version B, which does work?
My second example consists of 2 tiny programs. The former compile fine. Using the qualified name should do the same, but outputs ...\include\boost-1_32\boost\multi_index_container.hpp(60) : error C2039: 'multi_index_node_type' : is not a member of 'boost::detail' Where's the difference?
60 #include <boost/multi_index_container.hpp> 61 #include <boost/multi_index/ordered_index.hpp> 62 63 using boost::multi_index_container; 64 65 int main( int argc, char* argv[] ) 66 { 67 multi_index_container< int > mic; 68 return 0; 69 }
70 #include <boost/multi_index_container.hpp> 71 #include <boost/multi_index/ordered_index.hpp> 72 73 int main( int argc, char* argv[] ) 74 { 75 boost::multi_index_container< int > mic; 76 return 0; 77 }
Yes, MSVC++ 6.0/7.0 has problems locating a class template imported into a namespace with using. You can use the following instead: boost::multi_index::multi_index_container< int > mic; Anyway, I should comment on this in the compiler specifics section. HTH, Joaquín M López Muñoz Telefónica, Investigación y Desarrollo

Hi Joaquín M López Muñoz, thank you for your quick answer! I appreciate that multi_index_container exist and I can use it. In my opinion this library is very useful and facilitate many programs.
44 //version B: DOES compile 45 typedef index<employee_set,id >::type employee_set_by_id; 46 typedef index<employee_set,age>::type employee_set_by_age;
OK, fine.
48 //remove the name index (lines 31, 32) for following versions 49 50 //version C: DOES compile 51 typedef index<employee_set,id >::type employee_set_by_id;;
OK, too.
52 53 //version D: does NOT compile 54 //causes ...\include\boost-1_32\boost\mpl\vector\aux_\preprocessed\no_ctps\vector10.hpp(398) : 55 // error C2039: 'item3' : is not a member of 'boost::mpl::vector2<T0,T1>' 56 typedef index<employee_set,age>::type employee_set_by_age;
!! Here I'm missing somethig... Isn't version D exactly the same as version B, which does work?
Exact this I wanted to point out. Version D differs from version B in removing two lines 31, 32 only (i.e. the name index). Version C is nearly the same, too. Nevertheless there is a difference when compiling. best regards Volker Vieth
participants (3)
-
Joaquín Mª López Muñoz
-
Volker Vieth
-
wusel1311@gmx.de