ожидаемое первичное выражение в вызове algorithm::binary_search
-
12-11-2019 - |
Вопрос
Я надеюсь, что это не слишком очевидно.Я получаю эту загадочную ошибку :
fold.cpp:92: error: expected primary-expression before ‘)’ token
Строка, на которую он ссылается, - это:
if (binary_search (corpus.begin(),corpus.end(), left, customArray::operator<(customArray)))
Я пришел к этой ошибке после использования более простого вызова:
if (binary_search (corpus.begin(),corpus.end(), left))
и получаю это сообщение об ошибке (важной частью является примечание в конце, в котором говорится, что нужно изменить его на приведенный выше вызов)
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)
По сути, я пытаюсь использовать двоичный поиск по связанному списку пользовательских объектов (типа массива).Остальная часть кода relavent находится здесь:
// 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)))
{
}
Я надеюсь, это легко понять.Дайте мне знать, если я смогу каким-либо образом прояснить ситуацию.
Решение
Ваше первое сообщение об ошибке было вызвано тем, что binary_search
использует <
на итераторах, но итераторы списка не поддерживают <
.Эта ошибка не имеет никакого отношения к тому, передаете ли вы функцию сравнения в качестве аргумента binary_search
.
Ваше второе сообщение об ошибке связано с тем, что вы указали тип при передаче функции в качестве аргумента.Это в основном то же самое, что вызывать функцию как f(int x)
вместо f(x)
, что синтаксически неверно.Это просто должно быть customArray::operator<
.Однако, как я уже говорил ранее, это вам не поможет, потому что вы просто снова получите первое сообщение об ошибке.
В принципе, вы не можете выполнить двоичный поиск по связанному списку.
Другие советы
Вы помещаете всю подпись вашего функтора в ваш звонок в Binary_Search.Вам не нужен «Bool».