Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Operator problem with std::pair

0 views
Skip to first unread message

Leo Meyer

unread,
Sep 26, 2009, 9:54:38 AM9/26/09
to
Hello,

if I don't describe this problem properly, please ask me, I'm not an expert on the STL. This thing has me quite baffled.
I'm porting a program to Pocket PC 2002 using STLPort using MS EVC3 and I keep running into this problem:

...\STLport-5.2.1\stlport\stl/_algobase.c(198) : error C2678: binary '==' : no operator defined
which takes a left-hand operand of type 'struct stlp_std::pair<class CIMGFile,bool>' (or there is no acceptable conversion)

The problem occurs in an implementation of find:
template <class _InputIter, class _Tp>
_STLP_INLINE_LOOP _InputIter __find(_InputIter __first, _InputIter __last,
const _Tp& __val,
const input_iterator_tag &) {
while (__first != __last && !(*__first == __val)) ++__first;
^ on this line the error is reported
return __first;
}

As far as I can tell, the pair is being constructed with this macro call:
std::make_pair(CIMGFile(), true)

CIMGFile is a proper class that seems to compile ok.

Previously, in a header file, the programmer defined the == operator using:
inline bool operator == (std::pair<CIMGFile, bool> & p, int id )
{
return p.first.GetID() == id;
}

So STLPort keeps telling me that there is no == operator while there clearly should be. Note that it doesn't work either if I change
std::pair to stlp_std::pair or make it const in the operator definition. I have also tried "int & id" instead with no effect.
Is there something wrong about the type signature that I am missing? How can I get this operator definition to work?

Kind regards, Leo


Juha Nieminen

unread,
Sep 26, 2009, 10:36:45 AM9/26/09
to
Leo Meyer wrote:
> inline bool operator == (std::pair<CIMGFile, bool> & p, int id )

I can't tell (without actually trying) if it's the underlying problem,
but comparators should always take const references, not non-const
references, like you do above.

Leo Meyer

unread,
Sep 26, 2009, 11:05:49 AM9/26/09
to

Hi,
I have tried making both parameters const, such as:
inline bool operator == (const std::pair<CIMGFile, bool> & p, const int id )
but it doesn't work either.

Thanks and regards, Leo


Alf P. Steinbach

unread,
Sep 26, 2009, 11:54:14 AM9/26/09
to
* Leo Meyer:

Try to reproduce the problem in a minimal program.

Cheers & hth.,

- Alf

Leo Meyer

unread,
Sep 28, 2009, 3:02:38 AM9/28/09
to
Alf P. Steinbach wrote:
>> [operator problem]

> Try to reproduce the problem in a minimal program.
>
> Cheers & hth.,
>
> - Alf

I have replaced the offending find macro call with a simple loop. It compiles now.
Too many other problems for building a designated test case ;-)
Regards, Leo


--
Warning: This posting may contain traces of ISO 8859-1.


James Kanze

unread,
Sep 28, 2009, 3:53:29 AM9/28/09
to
On Sep 26, 2:54 pm, "Leo Meyer" <leome...@gmx.de> wrote:

> if I don't describe this problem properly, please ask me, I'm
> not an expert on the STL. This thing has me quite baffled.
> I'm porting a program to Pocket PC 2002 using STLPort using MS
> EVC3 and I keep running into this problem:

> ...\STLport-5.2.1\stlport\stl/_algobase.c(198) : error C2678: binary '==' : no operator defined
> which takes a left-hand operand of type 'struct stlp_std::pair<class CIMGFile,bool>' (or there is no acceptable conversion)

> The problem occurs in an implementation of find:
> template <class _InputIter, class _Tp>
> _STLP_INLINE_LOOP _InputIter __find(_InputIter __first, _InputIter __last,
> const _Tp& __val,
> const input_iterator_tag &) {
> while (__first != __last && !(*__first == __val)) ++__first;
> ^ on this line the error is reported
> return __first;
> }

This is deep in the standard library. The actual error is due
to something incorrect in the call which instantiated this
function. (It could also be a bug in the implementation of the
standard library, but my bets are with an error in your call.)
Could you write a very small program which displays the error,
and post it with all of the error messages?

(If you can, you might also try compiling with a different
compiler/library implementation. The quality of the error
messages varies greatly from one compiler to the next, and it's
possible that the error messages from a different compiler will
be clearer to you.)

> As far as I can tell, the pair is being constructed with this
> macro call: std::make_pair(CIMGFile(), true)

> CIMGFile is a proper class that seems to compile ok.

> Previously, in a header file, the programmer defined the ==
> operator using:
> inline bool operator == (std::pair<CIMGFile, bool> & p, int id )
> {
> return p.first.GetID() == id;
> }

> So STLPort keeps telling me that there is no == operator while
> there clearly should be. Note that it doesn't work either if I
> change std::pair to stlp_std::pair or make it const in the
> operator definition. I have also tried "int & id" instead with
> no effect. Is there something wrong about the type signature
> that I am missing? How can I get this operator definition to
> work?

Probably, the first argument of the operator== must be a
reference to const, although if you're passing in non-const
iterators to a standard container, it should still work. Still,
without seeing a concrete example, it's hard to tell.

--
James Kanze

0 new messages