Domanda

Spero che questo non sia dolorosamente ovvio.Sto ricevendo questo errore criptico:

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

La riga a cui si riferisce è:

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

Sono arrivato a questo errore dopo aver usato la chiamata più semplice:

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

e ottenere questo messaggio di errore (la parte importante è la nota alla fine, dicendo di cambiarla nella chiamata sopra)

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)
.

In sostanza, sto cercando di utilizzare una ricerca binaria su un elenco collegato di oggetti personalizzati (tipo di array).Il resto del codice relativo è qui:

// 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)))
{

}
.

Spero che sia facile da capire.Fammi sapere se c'è un modo in cui posso chiarire.

È stato utile?

Soluzione

Il primo messaggio di errore è stato perché binary_search utilizza < su iteratori, ma iteratori dell'elenco non supportano <.Questo errore non ha nulla a che fare con se passarti o meno una funzione di confronto come argomento a binary_search.

Il tuo secondo messaggio di errore è perché hai specificato il tipo quando si passa la funzione come argomento.Questo è fondamentalmente lo stesso di chiamare una funzione come f(int x) anziché f(x), che è sintatticamente errato.Dovrebbe essere solo customArray::operator<.Tuttavia, come ho detto prima, che non ti aiuterà perché riceverai di nuovo il primo messaggio di errore.

Fondamentalmente non è possibile eseguire una ricerca binaria su un elenco collegato.

Altri suggerimenti

Stai mettendo l'intera firma del tuo funtore all'interno della tua chiamata a Binary_Search.Non hai bisogno del 'bool' lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top