
On Nov 12, 2006, at 6:46 PM, David Abrahams wrote:
Matthias Troyer <troyer@phys.ethz.ch> writes:
Hi Beman, hi all
Due to recent changes to the filesystem library now, the header detail/identifier.hpp is now included in my projects and contains the dangerous code segment:
Is it just dangerous by definition, because it breaks your code on your compiler, or is there something else about it that I'm missing?
, boost::shared_ptr<my::B> >' src/boost/boost/utility/enable_if.hpp:36: instantiated from 'boost::enable_if<boost::is_base_of<boost::identifier<my::B, boost::shared_ptr<my::B> >, boost::shared_ptr<my::B> >, my::A&>'
Here is an example code exhibiting the bug. As far as I understand section 14.8.2 of the standard, SFINAE does not apply here since Id::value_type in detail/identifier.hpp is a valid type. To me this does not seem to be a compiler bug, but I'm not an expert. #include <boost/shared_ptr.hpp> #include <boost/detail/identifier.hpp> namespace my { struct A {}; struct B { B() {} virtual void foo()=0; virtual ~B() {} }; void operator << (A&, boost::shared_ptr<B> const&) {} } int main() { my::A a; boost::shared_ptr<my::B> b; a << b; } I provide an operator<< for the two types, but still Apple's version of g++-4.0.1 tries to instantiate the general template in detail/ identifier.hpp, and aborts with the following error message: src/boost/boost/detail/identifier.hpp: In instantiation of 'boost::identifier<my::B, boost::shared_ptr<my::B> >': src/boost/boost/type_traits/is_base_and_derived.hpp:141: instantiated from 'boost::detail::is_base_and_derived_impl2<boost::identifier<my::B, boost::shared_ptr<my::B> >, boost::shared_ptr<my::B> >' src/boost/boost/type_traits/is_base_and_derived.hpp:200: instantiated from 'boost::detail::is_base_and_derived_impl<boost::identifier<my::B, boost::shared_ptr<my::B> >, boost::shared_ptr<my::B> >' src/boost/boost/type_traits/is_base_of.hpp:21: instantiated from 'boost::is_base_of<boost::identifier<my::B, boost::shared_ptr<my::B> problem.cpp:22: instantiated from here src/boost/boost/detail/identifier.hpp:61: error: cannot declare field 'boost::identifier<my::B, boost::shared_ptr<my::B> >::m_value' to be of abstract type 'my::B' problem.cpp:8: note: because the following virtual functions are pure within 'my::B': problem.cpp:10: note: virtual void my::B::foo()