Указатель на функцию C ++;нет соответствующей функции - PullRequest
0 голосов
/ 03 марта 2012

Итак, у меня есть задание, попросившее меня использовать рандомизированную быструю сортировку, и я обнаружил проблемы с использованием указателей функций.

Функция сортировки находится в rqs.cpp:

template <typename Item_Type>
void rqs_with_range(std::vector<Item_Type> &vec, int p, int q,
                int (*cmp)(Item_Type, Item_Type));

Затем вмой файл cpp, у меня есть что-то вроде этого:

class Table{
   constructor....
   vector< vector<string>* >* holder; // table 
   int compare_str(vector<string>* a, vector<string>* b) {
      return a->at(compare_column) < b->at(compare_column) ? -1 :a->at(compare_column) == b->at(compare_column) ? 0 : 1;
  }

   void rqs{
      rqs_with_range( (*holder) , 1, int(holder->size()-1), &Table::compare_str);
   }
}

Компилятор говорит, что у меня есть ошибка в функции rqs, нет соответствующей функции.моя функция сравнения является функцией-членом таблицы, будет ли это причиной проблемы?

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Да, это проблема.

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

0 голосов
/ 03 марта 2012

Если вы уже используете шаблоны, пожалуйста, не используйте указатель на функцию.Вместо этого используйте объект функции:

template <typename Item_Type, typename Compare>
void rqs_with_range(std::vector<Item_Type> &vec, int p, int q, Compare comp);

Тогда следующая проблема: Сделать Compare_str не нестатической функцией-членом, т.е. функцией вне класса Table.С помощью модифицированного rqs_with_range вы также можете решить вашу проблему с помощью std :: mem_fun или std :: bind, но это не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...