Boost logo

Boost :

From: Moore, Paul (paul.moore_at_[hidden])
Date: 2001-01-22 10:39:49

Sorry to take up the list's time with this, but I don't know if this counts
as a bug in MSVC, or a problem with my understanding.

I'm in the process of changing class rational<I> to have explicit mixed mode
operators taking type I and type rational<I>. This turned out to be not too
hard, thanks to the operators.hpp header. However, I have a small problem
with operators - and /.

Not surprisingly, operators.hpp can't derive operator-(U, T) from
T::operator-=(U), as the operands are reversed. OK, it's another explicit
definition, but that's not an issue...

template <typename IntType> inline rational<IntType>
operator- (boost::call_traits<IntType>::param_type i, const
rational<IntType>& r)
    return rational<IntType>(i) -= r;

The problem is that, for a user-defined integer type MyInt,

    4 - rational<MyInt>(9,2)

doesn't compile. The error is

test.cpp(222) : error C2679: binary '-' : no operator defined which takes a
right-hand operand of type 'class boost::rational<class `anonymous
namespace'::MyInt>' (or there is no acceptable conversion)

Now, I can see how to derive this - define IntType as MyInt, promote 4 to
MyInt using the (available) conversion from int, and there's no problem. No
chain of 2 user-defined conversions, just a straightforward overload

BUT, it does require the compiler to deduce that IntType should be MyInt.

Clearly, MSVC can't manage this - the question is, does the standard allow
this deduction - ie, is it MSVC or my understanding that is at fault? I
suspect it's MSVC, but I can't be sure.

On a related note, if it is MSVC that doesn't handle this, is there any
reasonable workaround? I can do something like

template <typename IntType, typename T> inline rational<IntType>
operator- (T i, const rational<IntType>& r)
    IntType ii = i; // Require that T will convert implicitly to IntType
    return rational<IntType>(ii) -= r;

I don't imagine that this can have any nasty side-effects, but I do worry...


Boost list run by bdawes at, gregod at, cpdaniel at, john at