Предположим, у меня есть этот класс (унаследованный от std :: Vector, это просто пример)
#include <vector>
using namespace std;
template <class T>
class C : public vector<T> {
// I don't want to use static keyword
void transformation(T i) {
i *= 100;
}
public:
void method() {
for_each(this->begin(), this->end(), transformation);
}
};
int main() {
C<double> c;
for (int i=-3; i<4; ++i) {
c.push_back(i);
}
c.method();
}
Как мне вызвать for_each, используя метод класса внутри самого класса? Я знаю, что могу использовать ключевое слово static, но есть ли другой способ использовать объект функции без использования static?
Я получаю это сообщение об ошибке при компиляции:
for_each.cc:21:55: ошибка: невозможно преобразовать 'C :: transformation' из типа 'void (C ::) (double)' в тип 'void (C :: *) (double)' for_each (this-> begin (), this-> end (), преобразование);
Думаю, мне нужно где-то добавить .*
или ->*
, но я не могу понять, где и почему.
2 ответа
Во-первых, не наследовать от стандартных контейнеров, они не предназначены для наследования (нет виртуальных деструкторов и т. Д.).
Во-вторых, что касается вашей проблемы, это потому, что указатель на функцию-член не совпадает с указателем на функцию. Причина в том, что функция-член имеет скрытый первый параметр, который становится указателем this
в функции. Самый простой способ решить эту проблему - создать функцию static
.
Другое решение - использовать функцию std::bind
, поставляемую с С ++ 11:
for_each(this->begin(), this->end(),
std::bind(&C::transformation, this, std::placeholders::_1));
Если у вас нет C ++ 11 (даже если вы пометили свой вопрос как таковой), вы, вероятно, могли бы получить что-то работающее с std::mem_fun
или std::bind1st
.
Вам нужно привязать указатель this
:
public:
void method()
{
for_each(this->begin(), this->end(), bind(&C::transformation, this, placeholders::_1));
}
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
void transformation(T& i);
, а неvoid transformation (T i);
.