2012-01-14 3 views
2

Я написал себе функцию сравнения для sort(). Он работал хорошо, когда я так выразился.Ошибка компиляции с функцией сравнения, C++ sort

bool comp(string a, string b) 
{ 
    ...; 
} 

int main() 
{ 
    sort(...,...,comp); 
} 

Однако, когда я положил все это внутри класса, скажем:

class Test { 

public: 
    bool comp(string a,string b) 
    { 
     ...; 
    } 
    vector <string> CustomSort(vector <string> str) { 
     sort(...,...,comp); 
    } 
}; 

Существует ошибка компиляции «Нет функции соответствия для вызова„рода ......“

.

Почему это произошло

+5

Вы должны использовать 'bool comp (const string & a, const string & b)', я думаю. Это не влияет на поиск имени, но, безусловно, влияет на эффективность выполнения (построение, а затем уничтожение новой строки для каждого аргумента при каждом сравнении относительно дорого). –

ответ

6

Любой нестатический функция член класса X имеет дополнительный аргумент - ссылка/указатель (const) X который становится this. Поэтому сигнатура функции-члена не является такой, которая может быть переварена sort. Вам необходимо использовать boost::bind или std::mem_fun или std::mem_fun_ref. При использовании C++ 11 вы можете использовать std::bind.

std::sort(..., ..., std::bind(&Test::comp, this, _1, _2)); 

Давай думать об этом, лучшим решением в данном случае было бы сделать вашу функцию комп статична, потому что она не нуждается в this вообще. В этом случае ваш исходный код будет работать без изменений.

+0

Большое спасибо Армен :) Ваш ответ очень информативен. Сделать comp-функцию static проще всего. И мне нужно будет узнать больше, чтобы я мог понять понятия, которые вы упомянули. – rliu054

Смежные вопросы