operator ==和list :: remove()

时间:2012-04-15 21:34:29

标签: 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
}

由于myList.remove():

,程序无法编译
  

1&gt; c:\ program files(x86)\ microsoft visual studio   10.0 \ vc \ include \ list(1194):错误C2678:二进制'==':找不到哪个运算符采用类型的左操作数   '的std :: TR1 ::的weak_ptr&LT; _Ty&GT;' (或没有可接受的转换)1&gt;
  用1> [1> _Ty = int 1&gt; ]

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

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

有什么问题?

1 个答案:

答案 0 :(得分:6)

运算符重载由argument-dependent lookup找到,并且您的函数不适用,因为它未在名称空间std中定义(参数类型的名称空间,以及{{{{}内的表达式的上下文1}})。

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