Если я понимаю, что вы хотите сделать, в вашем фрагменте кода довольно много ошибок:
sizeof aArr
неверно, вам нужно явно указать размер (замечено ChrisW)
- Отсутствует спецификатор
virtual
в исходном объявлении operator()()
- Не уверен, где заканчивается ваш цикл
for
, поскольку нет соответствующего }
(я подозреваю, что его вообще не должно быть)
Вот некоторый код, который будет проходить через массив объектов A
(или A
) и вызывать operator()
для каждого, передавая переданный аргумент в качестве параметра param
:
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
typedef double param; // Just for concreteness
class A {
public:
virtual void operator()(param x) = 0;
};
class B : public A {
public:
void operator()(param x) { cerr << "This is a B! x==" << x << ".\n"; }
};
void function(A** aArr, size_t n, param theParam) {
void (A::*sFunc)(param x) = &A::operator();
for_each(aArr, aArr + n, bind2nd(mem_fun(sFunc), theParam));
}
int main(int argc, char** argv) {
A* arr[] = { new B(), new B(), new B() };
function(arr, 3, 42.69);
delete arr[0];
delete arr[1];
delete arr[2];
return 0;
}
mem_fun()
необходимо для преобразования указателя на функцию-член с одним параметром в объект-функцию с двумя параметрами; bind2nd()
затем создает из этого объекта с 1 параметром функцию, которая фиксирует аргумент, предоставленный для function()
в качестве 2-го аргумента. (for_each()
требуется однопараметрический указатель на функцию или функциональный объект.)
РЕДАКТИРОВАТЬ: Основываясь на Ответ Алекса Тингла , я делаю вывод, что вы, возможно, хотели, чтобы function()
делал много вещей с одним A
полученным объектом. В этом случае вам нужно что-то вроде:
void function(A** aArr, size_t n, vector<param> const& params) {
for (size_t i = 0; i < n; ++i) {
void (A::*sFunc)(param x) = &A::operator();
for_each(params.begin(), params.end(), bind1st(mem_fun(sFunc), aArr[i]));
}
}