Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2004-06-17 07:33:32


"John Maddock" <john_at_[hidden]> writes:

>> some code:
>>
>> template <typename DerivedT>
>> class A
>> {
>> BOOST_STATIC_ASSERT((boost::is_convertible<A<DerivedT>*, B*>::value));
>> [...]
>> };
>>
>> class B : public A<B>
>> {
>> };
>>
>> I want to check if the template parameter really specifies a derived type.
>> But the assert is always false.
>> How can i solve this?
>
> I think your code should be:
>
> template <typename DerivedT>
> class A
> {
> BOOST_STATIC_ASSERT((::boost::is_convertible<DerivedT*,
> A<DerivedT>*>::value));
> // this should work as well:
> BOOST_STATIC_ASSERT((::boost::is_base_and_derived<A<DerivedT>,
> DerivedT>::value));
> };
>
> class B : public A<B>
> {
> };
>
> However, the static asserts still always get triggered, and I'm not sure
> why: any language lawyers understand this?

Because B is an incomplete class in A's body, so the inheritance is
invisible. It's complete inside of A's member functions; you could
do the assert there...

-- 
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com

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