Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2003-03-05 18:49:21


"Ralf W. Grosse-Kunstleve" <rwgk_at_[hidden]> writes:

> Below is a stand-alone minimal test that still produces the same error message
> with MIPSpro:
>
> % CC -LANG:std zminmin.cpp
> cc-1108 CC: ERROR File = zminmin.cpp, Line = 13
> The indicated expression must have pointer-to-function type.
>
> static const unsigned long value = sizeof(bdhelper_t::check());
> ^
>
> 1 error detected in the compilation of "zminmin.cpp".
>
> The same code works correctly with gcc 2.96 and an EDG245-based compiler
> (Compaq cxx). However, here is an interesting observation:
>
> % cxx -std strict_ansi zminmin.cpp
> % a.out
> 4
>
> No problem with "strict_ansi." But:
>
> % cxx -std ansi -D__USE_STD_IOSTREAM zminmin.cpp
> cxx: Error: zminmin.cpp, line 13: operand of sizeof may not be a function
> static const unsigned long value = sizeof(bdhelper_t::check());
> ----------------------------------------------^
> cxx: Info: 1 error detected in the compilation of "zminmin.cpp".
>
> I am jumping to the conclusion that older EDG's don't support
> sizeof(some_function()). Does that sound plausible?

Not to me; this technique is used all over the Boost type traits.
Nothing would've ever worked with this compiler if that were true,
pretty much.

> What could be done to make the is_base_and_derived test work with
> MIPSpro? Is the test actually used in Boost.Python?

Yes.

> -- I noticed that MIPSpro chokes even if is_base_and_derived_impl2
> is not instantiated.
>
> Thanks!
> Ralf

There are any number of ways you could try reformulating this to make
the error go away. At worst you could try the __BORLANDC__ branch in
is_base_and_derived.hpp.

Another approach:

    template <typename B, typename D, typename T>
    static type_traits::yes_type bd_helper(D const volatile *, T);

    template <typename B, typename D>
    static type_traits::no_type bd_helper(B const volatile *, int);

template<typename B, typename D>
struct is_base_and_derived_impl2
{
    struct Host
    {
        operator B const volatile *() const;
        operator D const volatile *();
    };

    BOOST_STATIC_CONSTANT(bool, value =
        sizeof(bd_helper<B,D>(Host(), 0)) == sizeof(type_traits::yes_type));
};

>
> #include <iostream>
>
> template <typename B, typename D>
> struct bd_helper
> {
> static int check();
> };
>
> template<typename B, typename D>
> struct is_base_and_derived_impl2
> {
> typedef bd_helper<B,D> bdhelper_t;
> static const unsigned long value = sizeof(bdhelper_t::check());
> };
>
> int main()
> {
> unsigned long n = is_base_and_derived_impl2<int, float>::value;
> std::cout << n << std::endl;
> }
>
>
> __________________________________________________
> Do you Yahoo!?
> Yahoo! Tax Center - forms, calculators, tips, more
> http://taxes.yahoo.com/
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

-- 
Dave Abrahams
Boost Consulting
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