2012-04-15 3 views
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 
} 

프로그램은 (인해 myList.remove로 컴파일되지 않음) :

1> c : \ program files (x86) \ microsoft visual studio 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) 

문제가 무엇입니까?

+0

잘 모르겠지만 const 참조로 부울 연산자 ==를 정의 할 수 있습니까? – CharlesB

+0

와우, 나는 원래 그런 식으로 그것을 다시 잊어 버렸습니다. const 참조와 같은 문제. – user987280

답변

6

연산자 오버로드는 argument-dependent lookup에 있으며 네임 스페이스 std (인수 유형의 네임 스페이스 및 std::list::remove 내부 표현식의 컨텍스트)에 정의되어 있지 않으므로 함수가 적용되지 않습니다.

사용자 정의 술어 기능을 적용하려면 remove_if을 사용해야합니다. 일반적으로 수정할 수없는 라이브러리 내부 유형에 대한 연산자를 정의하지 마십시오.

+0

나는'std :: remove'와'std :: remove_if'를 의미한다고 생각한다. 또한, 귀하의 링크가 아무데도 가리키는 것 같습니다. – Fraser

+0

@Fraser fixed, thanks – Potatoswatter

+0

정보를 제공해 주셔서 감사합니다. 이 모든 것을 피하고 싶지만 weak_ptrs 목록에서 제거해야합니다. 네임 스페이스 std 안에 연산자 ==를 정의하는 것은 나쁜 생각일까요? 요소 자체를 인수로 사용하여 단항 술어와 함께 remove_if 만 사용했습니다. 제거하려고하는 포인터와 요소를 비교해야합니다. 두 번째 인수로 술어를 호출 할 수 있습니까? – user987280

관련 문제