Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

operator== and list::remove()

Tags:

c++

pointers

tr1

Test.h

#ifndef TEST_H
#define TEST_H

#include <memory>

template <class Type>
bool operator==(const std::weak_ptr<Type>& wp1, const std::weak_ptr<Type>& wp2)
{
std::shared_ptr<Type> sp1;

if(!wp1.expired())
    sp1 = wp1.lock();

std::shared_ptr<Type> sp2;

if(!wp2.expired())
    sp2 = wp2.lock();

return sp1 == sp2;
}

#endif

Test.cpp

#include "Test.h"
#include <list>


int main()
{
typedef std::list< std::weak_ptr<int> > intList;

std::shared_ptr<int> sp(new int(5));
std::weak_ptr<int> wp(sp);

intList myList;
myList.push_back(wp);

myList.remove(wp); //Problem
}

The program won't compile due to myList.remove():

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\list(1194): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::tr1::weak_ptr<_Ty>' (or there is no acceptable conversion) 1>
with 1> [ 1> _Ty=int 1> ]

But you can see the following defined in Test.h:

bool operator==(const std::weak_ptr<Type>& wp1, const std::weak_ptr<Type>& wp2)

What is the problem?

like image 774
user987280 Avatar asked Apr 15 '12 21:04

user987280


1 Answers

The operator overload is found by argument-dependent lookup, and your function doesn't apply as it's not defined in namespace std (the namespace of the argument types, and the context of the expression inside std::list::remove).

You should use remove_if to apply a custom predicate function. In general, don't attempt to define operators for types inside libraries you cannot modify.

like image 200
Potatoswatter Avatar answered Oct 04 '22 20:10

Potatoswatter