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
}
Программа не будет компилироваться из-за myList.remove():
1>c :\program files (x86 )\микрософт визуальная студия 10.0\vc\include\list (1194 ):ошибка C2678 :двоичный '==' :не найден оператор, который принимает левый -операнд типа 'std ::tr1 ::weak _ptr< _Ty>' (или нет приемлемого преобразования )1>
с 1> [ 1> _Ty=int 1> ]
Но вы можете увидеть следующее, определенное в Test.h:
bool operator==(const std::weak_ptr<Type>& wp1, const std::weak_ptr<Type>& wp2)
В чем проблема?