Question

J'espère que ce n'est pas douloureusement évident. Je reçois cette erreur cryptique:

fold.cpp:92: error: expected primary-expression before ‘)’ token

La ligne à laquelle il fait référence est:

if (binary_search (corpus.begin(),corpus.end(), left, customArray::operator<(customArray)))

Je suis arrivé à cette erreur après avoir utilisé l'appel plus simple:

if (binary_search (corpus.begin(),corpus.end(), left))

Et obtenir ce message d'erreur (la partie importante est la note à la fin, en disant de la changer en appel ci-dessus)

In function ‘bool std::binary_search(_ForwardIterator, _ForwardIterator, const _Tp&)     [with _ForwardIterator = std::_List_iterator<customArray>, _Tp = std::string [3]]’:
fold.cpp:92:   instantiated from here
/usr/include/c++/4.2.1/bits/stl_algo.h:4240: error: no match for ‘operator<’ in ‘__val <    __i. std::_List_iterator<_Tp>::operator* [with _Tp = customArray]()’
/usr/include/c++/4.2.1/bits/stl_algo.h: In function ‘_ForwardIterator   std::lower_bound(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator =   std::_List_iterator<customArray>, _Tp = std::string [3]]’:
/usr/include/c++/4.2.1/bits/stl_algo.h:4239:   instantiated from ‘bool    std::binary_search(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator =   std::_List_iterator<customArray>, _Tp = std::string [3]]’
fold.cpp:92:   instantiated from here
/usr/include/c++/4.2.1/bits/stl_algo.h:2906: error: no match for ‘operator<’ in   ‘__middle. std::_List_iterator<_Tp>::operator* [with _Tp = customArray]() < __val’
fold.cpp:16: note: candidates are: bool customArray::operator<(customArray)

Essentiellement, j'essaie d'utiliser une recherche binaire sur une liste liée d'objets personnalisés (type de tableau). Le reste du code relatif est ici:

// here is the custom class I am using in the list
class customArray
{
public:

  // this is a somewhat lame way to compare, but it seems to work
  bool operator< (customArray temp)
  {
    return array[0] < temp.array[0];
  }

 bool operator> (customArray temp)
  {
    return array[0] > temp.array[0];
  }

  bool operator== (customArray temp)
  {
    return ((array[0] == temp.array[0]) && (array[1] == temp.array[1]) && (array[2] == temp.array[2]));
  }

  string array[3];
};

//All of this stuff is in main

customArray one;
//some processing here to fill one
corpus.push_back (one);

// sort the list 
corpus.sort();
corpus.unique();

string left [3];

if (binary_search (corpus.begin(),corpus.end(), left, customArray::operator<(customArray)))
{

}

J'espère que c'est facile à comprendre. Faites-moi savoir s'il existe un moyen de clarifier.

Était-ce utile?

La solution

Votre premier message d'erreur était parce que binary_search les usages < Sur les itérateurs, mais les itérateurs de la liste ne prennent pas en charge <. Cette erreur n'a rien à voir avec le fait que vous passiez ou non une fonction de comparaison comme un argument pour binary_search.

Votre deuxième message d'erreur est dû au fait que vous avez spécifié le type lors du passage de la fonction comme un argument. C'est fondamentalement la même chose que d'appeler une fonction que f(int x) à la place de f(x), qui est syntaxiquement incorrect. Ça devrait être juste customArray::operator<. Cependant, comme je l'ai déjà dit, cela ne vous aidera pas, car vous obtiendrez à nouveau le premier message d'erreur.

Fondamentalement, vous ne pouvez pas effectuer une recherche binaire sur une liste liée.

Autres conseils

Vous mettez toute la signature de votre fonctor à l'intérieur de votre appel à Binary_Search. Vous n'avez pas besoin du «bool» là-bas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top