2013-12-07 5 views
1

Когда я вызываю функцию построения я получаюсортировка массива с пользовательским компаратором

ошибки C3867: «суффиксного массива :: ЧКИ»: вызов функции отсутствует список аргументов; использовать '& суффиксный массив :: CMP', чтобы создать указатель на член

ошибка C2780: 'аннулируются станд :: сортировать (_RanIt, _RanIt)': ожидает 2 аргументы - 3 при условии,

class A{ 

    private: 

    std::string text; 
    std::vector<int> array; 

    bool cmp(int a, int b) { 

     return std::lexicographical_compare(text.begin() + a, text.end(), text.begin() + b, text.end()); 
    } 

    void build(const std::string &str, std::vector<int> &vec) { 

     //some vector values actions 

     std::sort(vec.begin(), vec.end(), cmp); 

    public: 

    } 
}; 

могли бы вы, пожалуйста, скажите, что здесь не так? Я использую Visual C++ компилятор

ответ

3

Ваша функция сравнения A::cmp является нестационарным членом A. Таким образом, он принимает три аргумента: помимо двух аргументов, явно объявленных, он также принимает указатель на A, чтобы стать неявно доступным this. Он также отличается от обычных указателей функций: bool (A::)(int, int), который распадается на bool (A::*)(int, int) при передаче по значению.

Вы можете std::bind() вашу функцию к подходящему объекту, однако:

std::sort(vec.begin(), vec.end(), 
      std::bind(&A::cmp, this, std::placeholders::_1, std::placeholders::_2)); 
+0

Я собирался предложить ему сделать это статическая функция ... ваш совет является гораздо более полным. – Jekyll

+0

@Jekyll: Представление элемента 'static' тоже было моей первой идеей, но код фактически использует' A :: text' в функции 'A :: cmp()', т. Е. Объект действительно необходим. То есть, функция 'static' не решит проблему! –

+0

, так как функция bind была введена только в C++ 11 Интересно, как вы могли справиться с ней перед новым стандартом? (Мне это действительно не нужно, просто любопытно) – SAD

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