Boost logo

Boost :

From: Markus Schöpflin (markus.schoepflin_at_[hidden])
Date: 2007-11-21 04:46:54


Hello,

recently intrusive started failing on Tru64/CXX with the following errors:

cxx: Error: ../boost/intrusive/detail/utilities.hpp, line 543: incomplete
           type is not allowed (incompletetyp)
    const std::size_t value =
(std::size_t)sqrt2_pow_max<sizeof(std::size_t)*CHAR_BIT>::value;
------------------------------------------^
cxx: Error: ../boost/intrusive/detail/utilities.hpp, line 544: incomplete
           type is not allowed (incompletetyp)
    const std::size_t pow =
(std::size_t)sqrt2_pow_max<sizeof(std::size_t)*CHAR_BIT>::pow;
------------------------------------------^

The failure is caused by Tru64 being a 64 bit platform, but not having a
long long integer type, because the compiler mode used is strict_ansi.

Removing the #ifdef BOOST_HAS_LONG_LONG ... #endif in utilities.hpp,
therefore enabling the code in between, fixes the error.

AFAICT, what the code tries to do is provide precomputed values for some
constants dependent on the size of size_t. It does this by trying to deduce
the size of size_t from the definition of BOOST_HAS_LONG_LONG, which is not
correlated in general.

Can anybody think of an implementation for the following:

template<std::size_t N>
struct sqrt2_pow_max;

template<>
struct sqrt2_pow_max<sizeof(std::size_t)>
{
    static const std::size_t value = ...;
    static const std::size_t pow = ...;
};

providing the correct constants for value and pow, regardless of the bit
size of size_t? (I don't know the formula used to compute the values of
value and pow, hopefully Ion can provide those.)

Regards,
Markus


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