Re: Visual C++ Express won't compare object against float in std::upper_bound
"Igor Tandetnik" <itandetnik@mvps.org> wrote in message
news:%239O8SjbVHHA.4380@TK2MSFTNGP03.phx.gbl
"John Carson" <jcarson_n_o_sp_am_@netspace.net.au> wrote in message
news:%233YwSvaVHHA.972@TK2MSFTNGP04.phx.gbl
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.
Both, under VC2005 with iterator debugging. In fact, I believe you
need all three: Sample/Sample, Sample/float, float/Sample. The
debugging code checks that the predicate is in fact a proper
ordering, by comparing the two arguments both ways.
Yes, you are right. Defining all three makes it work using the original code
in main. Specifically:
namespace
{
class Sample
{
public:
Sample (float value, float position) : m_value(value),
m_position(position)
{}
float GetValue() const { return m_value; }
float GetPosition() const { return m_position; }
friend bool operator<(const Sample & lhs, float position);
friend bool operator<(float position, const Sample& rhs);
friend bool operator<(const Sample& lhs, const Sample& rhs);
private:
float m_value;
float m_position;
};
bool operator<(const Sample& lhs,float position)
{
return lhs.m_position < position;
}
bool operator<(float position, const Sample& rhs)
{
return position < rhs.m_position;
}
bool operator<(const Sample&lhs, const Sample& rhs)
{
return lhs.m_position < rhs.m_position;
}
typedef std::vector<Sample> SampleBuffer;
typedef SampleBuffer::iterator SampleIterator;
}
--
John Carson