2 votes

Fonction Compare personnalisée pour std::binary_search

Y a-t-il un problème avec ce code ?

bool Spellcheck::smart_comp(string value, string key){
    return true;
}

void func(){
    std::string aprox_key = "hello";
    if(std::binary_search(this->words.begin(), this->words.end(), aprox_key, smart_comp)){
        std::cout << "Found" << std::endl;
    }
}

J'essaie d'écrire ma propre fonction de comparaison pour comparer des chaînes de caractères dans la recherche binaire.

Je reçois l'erreur suivante :

xyz.cpp:40:85: error: no matching function for call to ‘binary_search(std::vector<std::basic_string<char> >::iterator, std::vector<std::basic_string<char> >::iterator, std::string&, <unresolved overloaded function type>)’
xyz.cpp:40:85: note: candidates are:
/usr/include/c++/4.6/bits/stl_algo.h:2665:5: note: template<class _FIter, class _Tp> bool std::binary_search(_FIter, _FIter, const _Tp&)
/usr/include/c++/4.6/bits/stl_algo.h:2698:5: note: bool std::binary_search(_FIter, _FIter, const _Tp&, _Compare) [with _FIter = __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >, _Tp = std::basic_string<char>, _Compare = bool (Spellcheck::*)(std::basic_string<char>, std::basic_string<char>)]
/usr/include/c++/4.6/bits/stl_algo.h:2698:5: note:   no known conversion for argument 4 from ‘<unresolved overloaded function type>’ to ‘bool (Spellcheck::*)(std::basic_string<char>, std::basic_string<char>)’

Toute aide est appréciée...

4voto

K-ballo Points 44794

Y a-t-il un problème avec ce code ?

bool Spellcheck::smart_comp(string const value, string const key){
  return true;
}

Sinon qu'il revient toujours true ? Oui, le problème de base est qu'une fonction membre possède un paramètre implicite this La signature ne correspond donc pas à celle du prédicat attendu. Vous devriez utiliser cette fonction static ou même une fonction libre ( friend si nécessaire). Vous copiez également le strings à chaque fois, il serait préférable que vous preniez les arguments par référence constante pour éviter les copies inutiles.

Dans le cas où le résultat réel du prédicat dépend de l'état de l'utilisateur. Spellcheck vous devrez lier cet état à la fonction membre afin de créer un objet fonction avec la signature appropriée :

std::binary_search(
    this->words.begin(), this->words.end()
  , std::bind( &Spellcheck::smart_comp, this )
);

2voto

Kerrek SB Points 194696

Vous essayez de passer une fonction membre non statique, qui n'est pas convertible en la fonction binaire requise (du fait de la présence de trois paramètres réels).

Essayez de déclarer votre smart_comp fonction static . (Bien sûr, vous ne pouvez pas faire référence aux membres de l'instance ; si vous avez besoin d'un état, vous devrez écrire un foncteur complet).

1voto

Antonio Pérez Points 2147

En supposant que this->words Le type de l'utilisateur est std::vector<std::string> y func est un membre de Spellcheck vous pouvez l'utiliser en déclarant smart_comp à être static . Mais je réfléchirais à deux fois à la conception de votre classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X