2012-04-15 19 views
6

Test.hoperador == y la lista :: 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 
} 

El programa no compilará debido a myList.remove() :

1> c: \ archivos de programa (x86) \ microsoft visual studio 10.0 \ vc \ include \ list (1194): error C2678: binario '==': no ​​se encontró operador que tome un operando de la izquierda del tipo 'std :: tr1 :: weak_ptr < _Ty>' (o no hay aceptables conversión) 1>
con 1> [1> _Ty = int 1>]

Pero se puede ver la siguiente definido en Test.h:

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

¿Cuál es el problema?

+0

no estoy seguro, pero ¿puedes intentar definir el operador bool == con referencias const? – CharlesB

+0

Vaya, lo tuve de esa manera originalmente y olvidé cambiarlo de nuevo. Mismo problema con las referencias de const. – user987280

Respuesta

6

La sobrecarga del operador se encuentra por argument-dependent lookup, y su función no se aplica ya que no está definido en el espacio de nombres std (el espacio de nombres de los tipos de argumentos, y el contexto de la expresión dentro std::list::remove).

Debe usar remove_if para aplicar una función predicado personalizada. En general, no intente definir operadores para los tipos dentro de las bibliotecas que no puede modificar.

+0

Supongo que te refieres a 'std :: remove' y' std :: remove_if'. Además, su enlace parece no apuntar a ninguna parte. – Fraser

+0

@Fraser solucionado, gracias – Potatoswatter

+0

Genial, gracias por la información. Me gustaría evitar esto por completo, pero debo eliminarlo de una lista de weak_ptrs. ¿Sería una mala idea definir operator == inside namespace std? Solo he usado remove_if con un predicado unario con el elemento como argumento. Necesitaría comparar el elemento con el puntero que intento eliminar. ¿Es posible llamar al predicado con un segundo argumento? – user987280