Boost logo

Boost :

From: Torsten Maehne (Torsten.Maehne_at_[hidden])
Date: 2008-06-06 09:51:54


Hello Steven,

thank you for helping me in debugging lambda.hpp!

Steven Watanabe wrote:
> AMDG
>
> Torsten Maehne wrote:
>>>> * All checks involving the multiplication/division of
>>>> boost::units::unit and boost::units::absolute<boost::units::unit>
>>>> types are not compiling. The compiler complains about ambiguous
>>>> overloads for operator* and operator/ (originating from Boost.Units
>>>> and Boost.Lambda). Therefore they are currently commented out.
>>>>
>>>>
>>> These shouldn't compile.
>>>
>> I modified the checks so that now units and absolute units are passed as
>> well as arguments to the lambda expressions. Then the ambiguous overload
>> errors disappear. However, for the absolute unit tests:
>> <snip>
>>
>> I left the non-compiling commented-out tests in place for documentation
>> purposes.
>>
>
> I looked at the tests. I misunderstood what you were testing.
> Allowing multiplication _1 * meters e.g. would require disambiguating
> overloads.

I have tried to add specializations to lambda.hpp like the following:

    /// Partial specialization of return type trait for action
    /// boost::lambda::functor<T> * unit<Dim, System>.
    template<typename System, typename Dim, typename T>
    struct plain_return_type_2<arithmetic_action<multiply_action>,
                               boost::lambda::lambda_functor<T>,
                               boost::units::unit<Dim, System> > {
        typedef typename boost::units::multiply_typeof_helper<
            boost::lambda::lambda_functor<T>,
            boost::units::unit<Dim, System> >::type type;
    };

, to disambiguate the overloads. However the specialization seems to be
not picked up by the compiler -- it still uses either:

boost::lambda::functor<T> * Y

or

Y * unit<Dim, System>

when uncommenting the check for bl::_1 * bu::meters in test_lambda.cpp.
(Note: I didn't add the specialization to the attached corrected
lambda.hpp.) Do you have an idea, what I'm doing wrong here?

>>>> * The check of unit<Dim1, System1> - unit<Dim2, System2> is not
>>>> compiling. The compiler finds no matching definition of operator-.
>>>>
>>>>
>>> Again these shouldn't compile.
>>>
>> This strikes me as being inconsistent, because it works for:
>>
>> unit<Dim1, System1> + unit<Dim2, System2>
>>
>
> I see. I didn't understand what you were testing, again.
> The problem is in units/lambda.hpp line 390 ff.
>
> /// Partial specialization of return type trait for action
> /// unit<Dim1, System1> - unit<Dim2, System2>.
> template<typename Dim1, typename Dim2, typename System1, typename
> System2>
> struct plain_return_type_2<arithmetic_action<minus_action>,
> boost::units::unit<Dim1, System1>,
> boost::units::unit<Dim2, System2> > {
> BOOST_STATIC_ASSERT((boost::is_same<System1, System2>::value ==
> true));
> typedef typename boost::units::subtract_typeof_helper<
> boost::units::*quantity*<Dim1, System1>,
> boost::units::*quantity*<Dim2, System2> >::type type;
> };
>
> These two quantities ought to be units.

Thanks for pointing me to this nasty copy & paste error. I corrected it
in the attached new lambda.hpp.

Best regards,

Torsten




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