
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?
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>
, 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&>' 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()