Pergunta

Espero que isso não seja dolorosamente óbvio.Estou recebendo este erro enigmático:

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

A linha a que se refere é:

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

Cheguei a este erro depois de usar a chamada mais simples:

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

e recebendo esta mensagem de erro (a parte importante é a nota no final, dizendo para alterá-la para a chamada acima)

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)

Essencialmente, estou tentando usar uma pesquisa binária em uma lista vinculada de objetos personalizados (tipo array).O resto do código relevante está aqui:

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

}

Espero que isso seja fácil de entender.Deixe-me saber se há alguma maneira de esclarecer.

Foi útil?

Solução

Sua primeira mensagem de erro foi porque binary_search usa < nos iteradores, mas os iteradores da lista não suportam <.Este erro não tem nada a ver com o fato de você passar ou não uma função de comparação como argumento para binary_search.

Sua segunda mensagem de erro é porque você especificou o tipo ao passar a função como argumento.Isso é basicamente o mesmo que chamar uma função como f(int x) em vez de f(x), o que é sintaticamente incorreto.Deveria ser apenas customArray::operator<.No entanto, como eu disse antes, isso não irá ajudá-lo porque você receberá a primeira mensagem de erro novamente.

Basicamente você não pode realizar uma pesquisa binária em uma lista vinculada.

Outras dicas

Você está colocando toda a assinatura do seu functor dentro da sua chamada para binary_search.Você não precisa do 'bool' aí.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top