Map dans une map (error C2678: '==' binaire)

Résolu
Polack77 Messages postés 1095 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 12 déc. 2017 à 17:14
cptpingu Messages postés 3840 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 23 août 2024 - 13 déc. 2017 à 17:06
Bonjour,

Je cherche à faire une map dans une map (rien de bien sorcier de mon point de vue).
Je dois trouver une liste d'élément à partir d'un CString.
Puis dans cette liste un autre élément à partir d'un autre CString.

Un code exemple tout simple :
	map<CString,map<CString,CString>> test;
	map<CString,map<CString,CString>>::iterator ittest;
	CString cleTest = "toto";
	ittest = find(test.begin(),test.end(),cleTest);

Le compilateur me sort une erreur C2678...

Je ne comprend pas pourquoi. Je voudrait simplement savoir si ma clé "toto" existe dans la map et si oui me retourner un iterator sur cet élément (élément contenant lui même une map, mais en quoi ça serait un problème ?!?!). Pourquoi il cherche à comparer des pairs .... O.O ...
Perdu HELP

Merci d'avance

PS :
J'ai cherché le code d'erreur et "map dans une map" mais je ne trouve que des infos sur des variables déclarer "const", or dans mon exemple (qui ne fonctionne pas hein) aucun const n'est présent (en ajouter un au niveau de la clé recherché ne change rien, passer en const mes map ne m'arrangerait pas, surtout dans l'exemple que je donne).

L'erreur au complet :
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xutility(3186): error C2678: '==' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'std::pair<_Ty1,_Ty2>' (ou il n'existe pas de conversion acceptable)
1> with
1> [
1> _Ty1=const CString,
1> _Ty2=std::map<CString,CString>
1> ]
1> est peut-être 'built-in C++ operator==(const char [5], const char [5])'
1> C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\include\guiddef.h(192): ou 'int operator ==(const GUID &,const GUID &)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2415): ou 'bool ATL::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC_DLL<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2422): ou 'bool ATL::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const char *) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC_DLL<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2429): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const char *,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC_DLL<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2437): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const wchar_t *) throw(...)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC_DLL<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2446): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const wchar_t *,const ATL::CStringT<BaseType,StringTraits> &) throw(...)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC_DLL<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2581): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(char,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC_DLL<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2588): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,char) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC_DLL<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2415): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2422): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const wchar_t *) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2429): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const wchar_t *,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2437): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const char *) throw(...)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2446): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const char *,const ATL::CStringT<BaseType,StringTraits> &) throw(...)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2581): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(wchar_t,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2588): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,wchar_t) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1> C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\include\propkeydef.h(32): ou 'int operator ==(const PROPERTYKEY &,const PROPERTYKEY &)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2415): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=ATL::StrTraitATL<char,ATL::ChTraitsCRT<char>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2422): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const char *) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=ATL::StrTraitATL<char,ATL::ChTraitsCRT<char>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2429): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const char *,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=ATL::StrTraitATL<char,ATL::ChTraitsCRT<char>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2437): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const wchar_t *) throw(...)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=ATL::StrTraitATL<char,ATL::ChTraitsCRT<char>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2446): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const wchar_t *,const ATL::CStringT<BaseType,StringTraits> &) throw(...)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=ATL::StrTraitATL<char,ATL::ChTraitsCRT<char>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2581): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(char,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=ATL::StrTraitATL<char,ATL::ChTraitsCRT<char>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2588): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,char) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=char,
1> StringTraits=ATL::StrTraitATL<char,ATL::ChTraitsCRT<char>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2415): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2422): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const wchar_t *) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2429): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const wchar_t *,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2437): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,const char *) throw(...)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2446): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const char *,const ATL::CStringT<BaseType,StringTraits> &) throw(...)' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2581): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(wchar_t,const ATL::CStringT<BaseType,StringTraits> &) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\cstringt.h(2588): ou 'bool ATL::CStringT<BaseType,StringTraits>::operator ==(const ATL::CStringT<BaseType,StringTraits> &,wchar_t) throw()' [trouvé à l'aide d'une recherche dépendante d'un argument]
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\exception(507): ou 'bool std::operator ==(const std::exception_ptr &,const std::exception_ptr &)'
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\exception(512): ou 'bool std::operator ==(std::nullptr_t,const std::exception_ptr &)'
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\exception(517): ou 'bool std::operator ==(const std::exception_ptr &,std::nullptr_t)'
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\system_error(426): ou 'bool std::operator ==(const std::error_code &,const std::error_condition &) throw()'
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\system_error(434): ou 'bool std::operator ==(const std::error_condition &,const std::error_code &) throw()'
1> lors de la tentative de mise en correspondance de la liste des arguments '(std::pair<_Ty1,_Ty2>, const char [5])'
1> with
1> [
1> _Ty1=const CString,
1> _Ty2=std::map<CString,CString>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xutility(3219) : voir la référence à l'instanciation de la fonction modèle '_InIt std::_Find<std::_Tree_unchecked_iterator<_Mytree>,const char[5]>(_InIt,_InIt,_Ty (&))' en cours de compilation
1> with
1> [
1> _InIt=std::_Tree_unchecked_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const CString,std::map<CString,CString>>>>>,
1> _Mytree=std::_Tree_val<std::_Tree_simple_types<std::pair<const CString,std::map<CString,CString>>>>,
1> _Ty=const char [5]
1> ]
1> c\Fichier.cpp(1527) : voir la référence à l'instanciation de la fonction modèle '_InIt std::find<std::_Tree_iterator<_Mytree>,const char[5]>(_InIt,_InIt,_Ty (&))' en cours de compilation
1> with
1> [
1> _InIt=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const CString,std::map<CString,CString>>>>>,
1> _Mytree=std::_Tree_val<std::_Tree_simple_types<std::pair<const CString,std::map<CString,CString>>>>,
1> _Ty=const char [5]
1> ]

4 réponses

Polack77 Messages postés 1095 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
13 déc. 2017 à 09:57
-_- arf oups j'étais visiblement fatigué hier....

C'est simplement un problème de syntaxe :/
Il ne faut pas utiliser la fonction find de cette façon mais dans l'objet map (la fonction find avec cette syntaxe est faite pour les vector et non pour les map :*) )
La correction de mon exemple :
	map<CString,map<CString,CString>> test;
	map<CString,map<CString,CString>>::iterator ittest;
	CString cleTest = "toto";
	ittest = test.find(cleTest);


En espérant que mon problème permette à quelqu'un de trouver une réponse son problème (en admettant que je ne sois pas le seul à faire ce genre d'erreur de syntaxe)
0
cptpingu Messages postés 3840 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 23 août 2024 126
13 déc. 2017 à 15:27
Bonjour.

Félicitations pour avoir trouver seul, et surtout merci de prendre le temps de répondre. Ça servira sans doute à d'autres :).

Attention, les "using namespace", c'est un peu dégueux, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace/

Pour alléger un peu l'écriture, si tu es en C++11 ou supérieur, tu peux écrire:
  std::map<CString, std::map<CString,CString> > test;
  CString cleTest = "toto";
  auto ittest = test.find(cleTest);


0
Polack77 Messages postés 1095 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
Modifié le 13 déc. 2017 à 16:41
Bah de rien ^^ (c'est normal de mon point de vue),

Oui je suis bien d'accord pour dire que les "using namespace" ce n'est pas propre (voir dangereux). Mais dans ce cas précis je travaille sur un projet existant.

Néanmoins, je m’autorise ça pour le "std" (et uniquement le std).

Par contre les types "auto" je trouve ça presque pire (car on ne voit pas explicitement le type qui sera utilisé en final, ce qui peut être source d'erreur).

PS :
Pour les débutants, un namespace dans le code, c'est un peu comme un dossier dans un disque.
On ne peut pas avoir deux fichiers identiques (même nom et extension) dans le même dossier. Bah c'est pareil avec les fonctions et les namespaces (on ne peut pas avoir deux fonctions avec la même signature dans le même namespace).
Dans l'un comme dans l'autre on peut déclarer des raccourcis :
- Via la variable système PATH dans le cas d'un dossier (c'est pour ça que quelque-soit le dossier actif dans une console si on tape "explorer" un explorateur de fichier s'ouvre)
- Via "using namespace" pour le code.
Résultat ça peut être dangereux, car si on a deux exécutables du même nom dans deux dossiers présents dans PATH, et qu'on appel cet exe. On ne sais pas vraiment quel exe on va exécuter en final. C'est pareil avec le code (bon même si des warnings/erreurs du compilo sont sensé nous prévenir). Donc moins il y a de "using namespace" mieux c'est (même si cela reste bien pratique il ne faut SURTOUT pas en abusé).
Ce "PS" concerne principalement Windows (même s'il existe des équivalents sur Linux ;) )
0
cptpingu Messages postés 3840 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 23 août 2024 126
13 déc. 2017 à 17:06
Ça reste super dangereux. Le souci ce n'est pas vraiment le conflit, qui est une gêne mineure. C'est surtout le masquage silencieux qui peut faire mal.
Cf le lien, il y a un exemple de masquage avec la std, notamment la fonction "count". Et comme tu ne sais pas ce qui peut être ajouté dans la STL, ton code peut casser silencieusement après une maj du compilo, bonheur :p.

Quand on ne veut pas tout écrire, on utilise des "using" simple ou des "using" alias. Une suite de "using" c'est un cran au dessus niveau propreté qu'une pollution globale via un using namespace.

Le "auto" a été ajouté pour une raison :). Ce n'est en rien pire, bien au contraire. Le typage n'est pas absent, il est juste déduit. Donc il n'est pas possible de se tromper (le compilo retournera les mêmes erreurs que si on écrivait le vrai type). C'est notamment très très utilisé pour les itérateurs, qui ont des types "painful" à écrire, sans valeur ajoutée. Le but de auto n'est pas d’être mis à toutes les sauces (et ne remplace pas des pod ou des objets simples), mais de remplacer les expressions compliquées ou celle impossible à déduire (en template avancé, il faut parfois adjoindre un template à un autre, juste pour déduire un type, l’apparition des auto a été un gros soulagement en terme de lisibilité et de complexité).
0
Rejoignez-nous