Boost logo

Boost :

From: Matthias Troyer (troyer_at_[hidden])
Date: 2006-11-12 14:01:33


On Nov 12, 2006, at 6:46 PM, David Abrahams wrote:

> Matthias Troyer <troyer_at_[hidden]> 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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk