
Joaquín Mª López Muñoz wrote:
The information you're giving is very interesting! The fact that the problem does not appear when using tags seems to hint at a nasty complication with the joint use of boost::is_base_and_derived and pointers to members as used in boost::multi_index::member.
I've attached a simple test case. Would you mind compiling it with and without /vmg? If it fails with /vmg, would you mind removing the type1 and type2 parts and leaving only type2?
I suppose you mean, that I should remove type1 and type2 parts and leave only type3? If that is correct, than these are the results of the test: 1) The test (foo.cpp) - as attached to the posting - compiles without any errors, if the /vmg option is *deactivated*. 2) The test (foo.cpp) - as attached to the posting - fails to compile with an internal compiler error, if the /vmg option is *activated*. As you expected, the internal compiler error occurs in the file 'is_base_and_derived.hpp' at BOOST_STATIC_CONSTANT() within the following struct: template<typename B, typename D> struct is_base_and_derived_impl2 { struct Host { operator B const volatile *() const; operator D const volatile *(); }; BOOST_STATIC_CONSTANT(bool, value = sizeof(bd_helper<B,D>::check_sig(Host(), 0)) == sizeof(type_traits::yes_type)); }; 3) I have removed the type1 and type2 parts and have leaved the type3 part. Now, the test (foo.cpp) compiles without any error, regardless of the /vmg compiler option. To ensure, that I have not misunderstood you, the following code shows the modifications I made to foo.cpp: #include <boost/config.hpp> #include <boost/type_traits/is_base_and_derived.hpp> #include <boost/multi_index/member.hpp> struct marker{}; template<typename T> struct is_marked { BOOST_STATIC_CONSTANT(bool,value=(boost::is_base_and_derived<marker,T>::value)); }; struct foo { int x; }; struct bar:private marker { }; //typedef is_marked<int> type1; //typedef is_marked<boost::multi_index::member<foo,int,&foo::x> > type2; typedef is_marked<bar> type3; int main() { //bool b1=type1::value; //bool b2=type2::value; bool b3=type3::value; return 0; } I hope I could help you. Regards, Jochen.