2012-04-15 39 views
6

Test.htoán tử == và danh sách :: remove()

#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 
} 

Chương trình sẽ không biên dịch do myList.remove() :

1> c: \ tệp chương trình (x86) \ microsoft visual studio 10.0 \ vc \ include \ list (1194): lỗi C2678: nhị phân '==': không tìm thấy toán tử nào có toán hạng bên trái của loại 'std :: tr1 :: weak_ptr < _Ty>' (hoặc không chấp nhận được chuyển đổi) 1>
với 1> [1> _Ty = int 1>]

Nhưng bạn sẽ nhìn thấy sau đây quy định tại Test.h:

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

vấn đề là gì?

+0

không chắc chắn, nhưng bạn có thể thử định nghĩa toán tử bool == với tham chiếu const không? – CharlesB

+0

Rất tiếc, tôi đã có nó theo cách đó ban đầu và quên thay đổi nó trở lại. Cùng một vấn đề với tham chiếu const. – user987280

Trả lời

6

Quá tải toán tử được tìm thấy bởi argument-dependent lookup và chức năng của bạn không áp dụng vì không được xác định trong không gian tên std (không gian tên của loại đối số và ngữ cảnh của biểu thức bên trong std::list::remove).

Bạn nên sử dụng remove_if để áp dụng chức năng vị ngữ tùy chỉnh. Nói chung, không cố gắng định nghĩa toán tử cho các kiểu bên trong các thư viện mà bạn không thể sửa đổi.

+0

Tôi đoán bạn có nghĩa là 'std :: remove' và' std :: remove_if'. Ngoài ra, liên kết của bạn dường như không trỏ đến đâu cả. – Fraser

+0

@Fraser cố định, cảm ơn – Potatoswatter

+0

Tuyệt vời, cảm ơn thông tin. Tôi muốn tránh điều này hoàn toàn nhưng tôi cần phải loại bỏ khỏi danh sách các weak_ptrs. Nó sẽ là một ý tưởng tồi để xác định operator == bên trong không gian tên std? Tôi chỉ sử dụng remove_if với một vị từ đơn vị với chính phần tử đó làm đối số. Tôi sẽ cần phải so sánh các yếu tố với con trỏ tôi đang cố gắng để loại bỏ. Có thể gọi vị từ với đối số thứ hai không? – user987280

Các vấn đề liên quan