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)
有什么问题?
答案 0 :(得分:6)
运算符重载由argument-dependent lookup找到,并且您的函数不适用,因为它未在名称空间std
中定义(参数类型的名称空间,以及{{{{}内的表达式的上下文1}})。
您应该使用std::list::remove
来应用自定义谓词函数。通常,不要尝试为无法修改的库中的类型定义运算符。