Je voudrais comparer des chaînes de caractères STL qui sont attribuées à différents allocateurs, par exemple, un ordinaire std::string
avec une chaîne à l'aide d'un custom STL allocateur. Malheureusement, il semble que d'habitude operator==()
ne fonctionne pas dans ce cas:
// Custom STL allocator to allocate char's for string class
typedef MyAllocator<char> MyCharAllocator;
// Define an instance of this allocator
MyCharAllocator myAlloc;
// An STL string with custom allocator
typedef std::basic_string
<
char,
std::char_traits<char>,
MyCharAllocator
>
CustomAllocString;
std::string s1("Hello");
CustomAllocString s2("Hello", myAlloc);
if (s1 == s2) // <--- ERROR: doesn't compile
...
En particulier, MSVC10 (VS2010 SP1) émet le message d'erreur suivant:
erreur C2678: binary '==' : l'opérateur n'a pas trouvé ce qui prend de la main gauche opérande de type 'std::string' (ou il n'est pas acceptable de conversion)
Ainsi, un niveau inférieur (moins lisible) code comme ceci:
if (strcmp(s1.c_str(), s2.c_str()) == 0)
...
doit être utilisé.
(Ceci est particulièrement gênant dans le cas où il y a par exemple std::vector
's de l'différemment affectés chaînes, où l'habitude simple v[i] == w[j]
de la syntaxe ne peut pas être utilisé.)
Cela ne semble pas très bon pour moi, depuis un allocateur personnalisé modifie la façon dont la chaîne de mémoire est requis, mais l' interface d'une classe de chaînes de caractères (y compris la comparaison avec operator==()
) est indépendant de la façon particulière qu'a une chaîne alloue de la mémoire.
Est-il quelque chose qui me manque ici? Est-il possible de garder le C++ interface de haut niveau et la surcharge de l'opérateur dans ce cas?