
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?
I feel that any template <class A, class B> ... operator<<(A&, B const&> is quite dangerous. The enable_if is meant to make it safe, but somehow SFINAE is not working here.
template <class Ostream, class Id> typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >, Ostream & >::type operator<<( Ostream & os, const Id & id ) { return os << id.value(); }
which breaks all of my codes, since I have a type Id, that has a type member Id::value_type which is an abstract base class. My compiler (Apple gcc-4.0) now tries to instantiate identifier< typename Id::value_type, Id >, which fails because Id::value_type is abstract, and the compiler aborts with an error message.
Is that a compiler bug?
I'm not sure, it could be: identifier< typename Id::value_type, Id > fails to get instantiated because typename Id::value_type is an abstract type. Should SFINAE catch this without giving an error?
Is your Id in namespace boost?
Yes, it is a shared_ptr<T> where T is an abstract base class. Matthias