У меня есть что-то вроде этого:
Метод Foo::Count должен использовать std::lower_bound() для нахождения элемента в vector в соответствии с парой двух строк. Теперь часть, которая не работает. Для lower_bound() Я предоставляю метод comparator() . Я думал, что все в порядке, но g++ говорит:
И метод Count() должен оставаться const .
Я новичок в С++, потому что я вынужден изучить его.
Вы должны сделать Foo::comparator static или обернуть его в объект класса std::mem_fun . Это связано с тем, что lower_bounds ожидает, что сравнитель будет классом объекта, который имеет оператор вызова, например, указатель функции или объект-функтор. Кроме того, если вы используете С++ 11 или более поздней версии, вы также можете использовать dwcanillas и использовать функцию лямбда. С++ 11 также имеет std::bind .
Самое простое решение состоит в том, чтобы сделать функцию компаратора статичной:
При вызове в Count его имя будет Foo::comparator .
Теперь у вас есть это, не имеет смысла быть нестатической функцией-членом, потому что она не использует никаких переменных-членов Foo .
Другой вариант — сделать его нечленой функцией, особенно если имеет смысл, что этот компаратор может использоваться другим кодом, кроме как только Foo .
У меня есть два класса, которые я хочу по цепочке (основной -> выполнить -> вычислить). Однако проблема в том, что когда я использую:
Добавление не будет вызвано, даже если компилятор не вернет никакой ошибки. Если я попытаюсь удалить ссылку на
Компилятор возвращает ошибку
Пробовал использовать static до void с тем же результатом, что и с использованием reference.
Решение
У вас есть несколько проблем в вашем коде. Давайте начнем:
Это означает, что вы должны создать экземпляр для расчета или пометить метод как статический. static void addition(double&, double, double);
Так что измени свой класс на
Следующая проблема заключается в том, что в вашем операторе switch вы создаете только указатели на функции
Это никогда не выполняет функцию, а только создает указатель на функцию, который сразу отбрасывается.
Чтобы заставить ваш код работать, рассмотрите этот код (обратите внимание на комментарии в коде, которые объясняют необходимые изменения):
Надеюсь, это поможет понять ваши проблемы.
Другие решения
Для вызова любого метода в классе calc вы должны сначала объявить переменную, а затем вызвать метод, например:
или вы определяете методы как статические функции, в этом случае вызов будет таким
This question already has an answer here:
I have something like this:
The method Foo::Count should use std::lower_bound() to find element in vector according to pair of two strings. Now the part which doesn’t work. To lower_bound() I’m providing method comparator() . I thought it was okay, but g++ says:
And the method Count() must stay const .
I’m quite new to C++ because I’m forced to learn it.
marked as duplicate by ecatmur c++ Users with the c++ badge can single-handedly close c++ questions as duplicates and reopen them as needed. Jul 21 ’15 at 9:13
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
3 Answers 3
You must make Foo::comparator static or wrap it in a std::mem_fun class object. This is because lower_bounds expects the comparor to be a class of object that has a call operator, like a function pointer or a functor object. Also, if you are using C++11 or later, you can also do as dwcanillas suggests and use a lambda function. C++11 also has std::bind too.
The simplest fix is to make the comparator function be static:
When invoking it in Count , its name will be Foo::comparator .
The way you have it now, it does not make sense to be a non-static member function because it does not use any member variables of Foo .
Another option is to make it a non-member function, especially if it makes sense that this comparator might be used by other code besides just Foo .