2017-09-15 14 views
-1

Comment supprimer un objet sous forme QlisteSupprimer un élément de QList lance erreur

QList<CascadeJobInfo> m_InternJobInfoList; 
foreach (CascadeJobInfo jobInfo, m_InternJobInfoList) 
{ 

    m_InternJobInfoList.removeOne(jobInfo); 
} 

il jette une erreur C: \ Qt \ Qt5.7.0 \ 5.7 \ mingw53_32 \ include \ QtCore \ qlist.h: 972 : erreur: pas de match pour 'opérateur ==' (types d'opération sont 'CascadeJobInfo' et 'const CascadeJobInfo') si (n> t() == t) ^

+0

Une fois que vous appelez removeOne, la liste ne reste pas le même que précédemment. Foreach peut sortir de la gamme parce que certains éléments ont été retirés. –

+1

@ PhạmAnhTuấn 'foreach' prend une copie de la liste, donc ce code est sûr s'il est inefficace. –

+0

:(donc est-il sûr d'utiliser itérateur au lieu de foreach – Sijith

Répondre

2

Vous devez mettre en œuvre operator== pour le type CascadeJobInfo:

class CascadeJobInfo 
{ 
public: 
    <...> 
    bool operator==(const CascadeJobInfo & other) const; 
    <...> 
}; 

bool CascadeJobInfo::operator==(const CascadeJobInfo & other) const 
{ 
    if (this == &other) { 
     return true; 
    } 

    bool equal = <...compare each data member within this object with its counterpart in other...>; 
    return equal; 
} 

Le official documentation dit que assez clair:

This function requires the value type to have an implementation of operator==().

En outre, on ne sait pas ce que vous essayez d'atteindre à partir de votre extrait de code. Tenter de supprimer l'élément de chaque liste en itérant sur la liste a une alternative plus simple: la méthode clear().

+0

I vouloir supprimer l'élément actuel "jobInfo" Ne pas vouloir supprimer l'élément entier – Sijith

1

Vous ne demandez pas comment supprimer « un » objet d'une liste, mais comment supprimer tous les objets. Utilisez clear():

m_InternJobInfoList.clear(); 

Si vous vous demandez comment supprimer uniquement les objets pour lesquels un certain prédicat est vrai, vous voudriez utiliser erase à la place:

auto & list = m_InternJobInfoList; 
auto const pred = [](const CascadeJobInfo &){ return true; }; 
list.erase(std::remove_if(list.begin(), list.end(), pred), list.end()); 

Bien sûr pred pourrait faire quelque chose de plus utile.

Dans le future C++ et Qt, nous espérons que vous serez en mesure de le faire simplement

erase_if(list, pred); 
+0

Merci pour l'explication détaillée, mais le code semble complexe, je veux supprimer l'objet particulier "jobInfo" si un paramètre dans jobinfo correspond à mon membre varable – Sijith

+0

Je ne suis pas comprendre le code que vous avez donné, comment vous avez supprimé la liste de formulaire d'objet particulier – Sijith

+0

@Sijith, vous devrez peut-être être familier avec le [effacer idiome effacer] (https://en.wikipedia.org/wiki/Erase%E2%80 % 93remove_idiom) Si vous êtes, cette réponse devrait être claire ... – Mike