Как отметил @ steveo225, f
в этом контексте имеет тип void (a::*)(int)
, а не void (*)(int)
. Существует два подхода к решению этой проблемы. Первый - сделать b::foreach_x_do
шаблоном-функцией-членом, который принимает любой вызываемый тип:
class b {
int* x;
public:
b() : x() { }
template<typename F>
void foreach_x_do(F f) {
while(*x++)
f(*x);
}
};
class a {
b b_inst;
public:
void f(int x) { }
a() : b_inst() {
b_inst.foreach_x_do(std::bind(&a::f, this, _1));
}
};
Второй - сохранить b::foreach_x_do
не-шаблон и заставить его принимать std::function<>
вместо указателя функции:
class b {
int* x;
public:
b() : x() { }
void foreach_x_do(std::function<void(int)> const& f) {
while(*x++)
f(*x);
}
};
class a {
b b_inst;
public:
void f(int x) { }
a() : b_inst() {
b_inst.foreach_x_do(std::bind(&a::f, this, _1));
}
};
В любом случае замените std::bind
и std::function
их аналогами boost::
, если ваш компилятор слишком стар, чтобы поставляться с реализациями std::
или std::tr1::
. Также обратите внимание, что если у вас есть компилятор C ++ 11, вы можете использовать лямбду вместо bind
.