invalid use of non static member function

У меня есть что-то вроде этого:

Метод 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 .

Оцените статью