J'ai un std::list
de boost::shared_ptr<T>
et je veux en retirer un élément mais j'ai seulement un pointeur de type T * qui correspond à l'un des éléments de la liste.Quelle est la bonne façon de supprimer un boost :: shared_ptr d'une liste?
Cependant je ne peux pas utiliser myList.remove(tPtr)
Je devine parce que shared_ptr n'implémente pas ==
pour son type d'argument de modèle.
Ma pensée immédiate était d'essayer myList.remove(shared_ptr<T>(tPtr))
qui est syntaxiquement correct, mais il va se bloquer à partir d'une double suppression puisque le shared_ptr
temporaire a un use_count séparé.
std::list< boost::shared_ptr<T> > myList;
T* tThisPtr = new T(); // This is wrong; only done for example code.
// stand-in for actual code in T using
// T's actual "this" pointer from within T
{
boost::shared_ptr<T> toAdd(tThisPtr); // typically would be new T()
myList.push_back(toAdd);
}
{
//T has pointer to myList so that upon a certain action,
// it will remove itself romt the list
//myList.remove(tThisPtr); //doesn't compile
myList.remove(boost::shared_ptr<T>(tThisPtr)); // compiles, but causes
// double delete
}
Les options que je vois restants sont à utiliser std :: trouver une coutume comparer ou faire une boucle dans la liste force brute et de trouver moi-même, mais il semble qu'il devrait y avoir une meilleure façon. Est-ce que je manque quelque chose d'évident, ou est-ce simplement une utilisation non-standard pour faire une suppression de la façon propre/normale?
+1 pour la solution la plus directe au problème. –