Ошибка «Неполный тип» при объявлении параметра шаблона указателя на член функции для std :: function

Вот декларация:

#include <functional>

class A { ... };

double fA( std::function<double((A::*)(double))> fp) { ... }

что дает мне ошибку

В функции «двойной fA (std :: function)»:
tb.cpp: 32: 8: ошибка: «fp» имеет неполный тип

Хотя нет проблем с

double fA( double ((A::*fp)(double)) ) { ... }

Как правильно указать этот тип в качестве параметра шаблона для std::function?

0

Решение

Я не совсем уверен, что вы действительно хотите. Аргумент к std::function должна быть свободной сигнатурой функции, как указано в стандарте:

template<class R, class... ArgTypes>
class function<R(ArgTypes...)>;

Обратите внимание, что аргумент является подписью operator() это будет предложено объектом функции. Это не может быть указатель на член к другому типу, это просто тип возвращаемого значения и аргументы std::function<> объект создается.

Дополнительный набор скобок в объявлении функции может указывать, что вы действительно хотите создать std::function функциональный объект, который принимает в качестве аргумента указатель на член и возвращает double, Если это так, то подпись аргумента std::function отсутствует тип возвращаемого значения:

std::function<double (void (A::*)(double))> fp;

Который может быть инициализирован с:

double myfunc( void (A::*mptr)(double) ) {}
// ...
fp = myfunc;
1

Другие решения

Законченный делать что-то очень похожее на предложение @ chris, код из его примера выглядит следующим образом:

#include <functional>
#include <iostream>

struct S {
void foo() {std::cout << i;};
int i;
};

void bar(std::function<void()> func) {
func();
}

int main() {
S s1, s2;
s1.i = 5;
s2.i = 6;

bar(std::bind(&S::foo, s1));
bar(std::bind(&S::foo, s2));
}
0

По вопросам рекламы [email protected]