Re: Visual C++ Express won't compare object against float in std::upper_bound
John Carson wrote:
"Ulrich Eckhardt" <eckhardt@satorlaser.com> wrote in message
news:hjata4-qnv.ln1@satorlaser.homedns.org
tron.thomas@verizon.net wrote:
SampleIterator midSample = std::upper_bound(samplings.begin(),
samplings.end(), 0.5f);
Uses operator<
I noticed that too. However, the issue is not whether the member and
non-member operators have the same order, but what order the upper_bound
function requires.
error C2678:
binary '<' : no operator found which takes a left-hand operand of
type '`anonymous-namespace'::Sample' (or there is no acceptable
conversion)
Yep, noticed that too, and drew the same conclusion as you did: that the
upper_bound function requires Sample as the LHS. Turns out, however, that:
1. Neither order compiles in Debug mode.
2. The *original* order compiles in Release mode.
Comeau online won't compile either order.
One way around the problem in Debug mode is to define the comparison
operator to take two Sample arguments rather than a Sample and a float.
Naturally, that also means supplying a Sample object as the third argument
to upper_bound.
Just for the record, there are two thing that could be wrong:
1. the OP defined
operator>( Sample, float) as member
operator<( float, Sample) as free function
obviously the first one is not used for upper_bound! That's why I explicitly
marked which operators and with which operands are used/defined.
2. I'm not sure here, but how does lookup behave if we had one or two
operator< as member and the one that fits as nonmember? Would the nonmember
even be considered? How about the opposite case?
Anyway, I'd really look at the docs for upper_bound. If it turns out it only
accepts the same type as the value type of the iterator, then calling it
with a float is at least an extension if not an accidental bug.
Uli