Поэтому у меня есть задание, которое имеет эту структуру данных
struct ZipCode
{
char s[4];
int zip;
bool operator() (const ZipCode &lhs, const ZipCode &rhs) const
{return lhs.s[1] < rhs.s[1];}
bool operator() (const char* st, const int &z) const
{return st == s && z == zip;}
bool operator() (const int &z) const
{return zip == z;}
};
Затем я вставляю массив из них в STL: set и пытаюсь найти тот, у которого есть определенный почтовый индекс позже. Я делаю это, используя find_if, как это
std::set<ZipCode, ZipCode>::iterator itz = find_if(mySet.begin(), mySet.end(),ZipCode()(0xbb77));
Когда я его компилирую, я получаю следующую ошибку:
c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm (83): ошибка C2064: термин не оценивает функцию, принимающую 1 аргумент
Я не уверен, в чем проблема или как решить эту проблему
Прежде всего, создание структуры как хранилища для вашей информации, так и функтора с тремя различными видами использования - плохой дизайн. Это слишком запутанно. Я почти думал, что std::set<ZipCode, ZipCode>
является незаконным.
Во-вторых, чистое решение вашей проблемы должно быть картой. std::map<int, std::array<char, 4>>
. Общие алгоритмы STL ничего не знают о хороших свойствах любой структуры данных в std::set
(обычно это красно-черное дерево), поэтому используйте map::find
вместо этого.
Вы получаете ошибку, потому что operator() является функцией-членом, и поэтому используемая вами использует два параметра: this
и 0xbb77.
Вместо этого вы можете использовать set::find
.
Если вы хотите выполнить поиск с использованием разных значений членов класса, вы должны указать три конструктора для ZipCode
, где каждый из них принимает те же параметры, что и одна из перегрузок operator(). Затем добавьте функцию == (const ZipCode & other) и избавьтесь от оператора() s.
Я бы напечатал его, но это было трудно сделать на iPad
st == s
не делает то, что вы думаете, что делает в этом выражении:bool operator() (const char* st, const int &z) const {return st == s && z == zip;}
strcmp(st,s)
хотя он работал, и я немного удивлен, что именно сейчас вы указали на это.