Hi, I guess there is a bug in boost/multi_index/sequenced_index.hpp. The following program fails to compile, because there is no matching operator== for class C. But this operator shouldn't be required for splice. #include "boost/multi_index/sequenced_index.hpp" #include "boost/multi_index_container.hpp" struct C { }; int main() { using namespace boost; using namespace boost::multi_index; typedef multi_index_container<C, indexed_by<sequenced<> > > Cs; Cs cs; cs.push_back(C()); cs.splice(cs.end(), cs, cs.begin()); // XXX: compile error } The following program compiles, but both assertions fail at runtime: #include "boost/multi_index/sequenced_index.hpp" #include "boost/multi_index_container.hpp" int main() { using namespace boost; using namespace boost::multi_index; typedef multi_index_container<int, indexed_by<sequenced<> > > ints; ints foo; foo.push_back(42); ints bar; bar.push_back(42); foo.splice(foo.end(), bar, bar.begin()); assert(foo.size() == 2); assert(bar.size() == 0); } I have made both tests with the boost library in Debian/unstable (version 1.33.1-7). I have also compared the source file sequenced_index.hpp with the CVS-MAIN version (1.12). I guess the following patch should fix this bug: --- sequenced_index.hpp.orig 2006-09-29 11:38:06.000000000 +0200 +++ sequenced_index.hpp 2006-09-29 11:39:43.000000000 +0200 @@ -355,7 +355,7 @@ BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(i); BOOST_MULTI_INDEX_CHECK_IS_OWNER(i,x); BOOST_MULTI_INDEX_SEQ_INDEX_CHECK_INVARIANT; - if(x==*this){ + if(&x==this){ if(position!=i)relink(position.get_node(),i.get_node()); } else{ @@ -388,7 +388,7 @@ BOOST_MULTI_INDEX_CHECK_IS_OWNER(last,x); BOOST_MULTI_INDEX_CHECK_VALID_RANGE(first,last); BOOST_MULTI_INDEX_SEQ_INDEX_CHECK_INVARIANT; - if(x==*this){ + if(&x==this){ BOOST_MULTI_INDEX_CHECK_OUTSIDE_RANGE(position,first,last); if(position!=last)relink( position.get_node(),first.get_node(),last.get_node()); regards, Hubert