Boost logo

Boost :

From: Matthias Troyer (troyer_at_[hidden])
Date: 2006-11-13 15:09:56

On Nov 13, 2006, at 4:08 PM, David Abrahams wrote:

> Matthias Troyer <troyer_at_[hidden]> writes:
>> On Nov 12, 2006, at 6:46 PM, David Abrahams wrote:
>>> Matthias Troyer <troyer_at_[hidden]> writes:
>>>> 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?

> Maybe you're actually saying that you don't have a type called Id; you
> just have
> shared_ptr<T>.

Yes, sorry if I was unclear.
> Fair enough. I think the correct thing to do is put the definition of
> class template identifier in its own subnamespace of boost along with
> the streaming operator (no need for enable_if). It could then be
> imported into namespace boost with a using declaration...
> Frankly, I'm not sure that reserving the name boost::identifier is the
> right thing to do, especially if it's in a detail header. Is this a
> public interface, or not? If not, it shouldn't be directly in
> boost::. If so, it should be documented somewhere and it should have
> passed through a review. Did it?

It was checked in on November 3rd by Beman Dawes, and I recently
realized that now my codes are broken becuase of it.


Boost list run by bdawes at, gregod at, cpdaniel at, john at