6

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?

4

1 に答える 1

6

演算子のオーバーロードは引数依存のルックアップstdによって検出され、名前空間(引数タイプの名前空間、および内部の式のコンテキスト)で定義されていないため、関数は適用されませんstd::list::remove

remove_ifカスタム述語関数を適用するには、を使用する必要があります。一般に、変更できないライブラリ内の型の演算子を定義しようとしないでください。

于 2012-04-15T22:17:06.830 に答える