6

测试.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

测试.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)\microsoft visual studio 10.0\vc\include\list(1194): error C2678: binary '==' : no operator found which take a left-hand operand of type 'std:: tr1::weak_ptr<_Ty>' (或没有可接受的转换) 1>
with 1> [ 1> _Ty=int 1> ]

但是您可以在 Test.h 中看到以下定义:

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

问题是什么?

4

1 回答 1

6

运算符重载由依赖于参数的查找找到,并且您的函数不适用,因为它未在命名空间std(参数类型的命名空间和内部表达式的上下文std::list::remove)中定义。

您应该使用remove_if来应用自定义谓词函数。通常,不要尝试为无法修改的库中的类型定义运算符。

于 2012-04-15T22:17:06.830 回答