|
Boost Users : |
Subject: Re: [Boost-users] [proto]Compile issue on Sun Solaris 10, Sun Studio 12.2
From: Eric Niebler (eric_at_[hidden])
Date: 2010-10-05 19:36:44
On 10/5/2010 9:13 AM, Sascha Ochsenknecht wrote:
> Hello,
>
> I got an error from the Sun Studio 12.2 (CC 5.11) when trying to compile
> my sources.
> The error comes out of the Boost.Proto library (actually I'm doing
> something with Boost.Spirit and Boost.Spirit is using Boost.Proto ...,
> but I don't think that the problem is in the client code, it seems to
> come from the buggy compiler). I'm using Boost 1.43.
>
> This is what I got from the compiler:
>
> "...include/boost/proto/detail/decltype.hpp", line 343: Error: Partial
> specialization parameter V is not used in the arguments.
Can you try replacing the definition of result_of_ in decltype.hpp with
the following:
template<typename T>
struct sun_workaround_helper
{
typedef T type;
};
template<typename T, typename Void = void>
struct result_of_2
: boost::tr1_result_of<typename T::type>
{};
template<typename T, typename U, typename V>
struct result_of_2<
sun_workaround_helper<T U::*(V)>
, typename enable_if_c<is_member_object_pointer<T
U::*>::value>::type
>
{
BOOST_STATIC_CONSTANT(bool, is_V_a_smart_ptr = 2 ==
sizeof(test_V_is_a_U<U>(&lvalue(make<V>()))));
BOOST_STATIC_CONSTANT(bool, is_ptr_to_const = 2 ==
sizeof(test_ptr_to_const(BOOST_PROTO_GET_POINTER(U, make<V>()))));
// If V is not a U, then it is a (smart) pointer and we
can always return an lvalue.
// Otherwise, we can only return an lvalue if we are
given one.
typedef
typename mpl::eval_if_c<
(is_V_a_smart_ptr || is_reference<V>::value)
, mpl::eval_if_c<
is_ptr_to_const
, add_reference<typename add_const<T>::type>
, add_reference<T>
>
, mpl::identity<T>
>::type
type;
};
////////////////////////////////////////////////////////////////////////////////////////////
// result_of_ is a wrapper around boost::result_of that also
handles "invocations" of
// member object pointers.
template<typename T>
struct result_of_
: result_of_2<sun_workaround_helper<T> >
{};
Let me know how that works. Thanks,
-- Eric Niebler BoostPro Computing http://www.boostpro.com
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net