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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With