Quando si compila il seguente codice:non può chiamare generico membro std :: funzione dalla classe modello
#include <functional>
template <typename functionSignature>
class Class
{
std::function<functionSignature> func;
public:
Class(const std::function<functionSignature>& arg) : func(arg) {}
void callFunc() { func(); }
};
void f(const int i) {}
int main()
{
Class<void(const int)> a(std::bind(f, 10));
a.callFunc();
return 0;
}
Il compilatore VS 2015 genera il seguente messaggio di errore alla sesta riga:
error C2064: term does not evaluate to a function taking 0 arguments.
Ora, Credo che questo sia dovuto al fatto che il compilatore pensa che lo functionSignature
non sia, beh, una firma di funzione; lo stesso errore si verifica quando istanziato e provo a chiamare operator()
su un std::function<int>
invece di std::function<int()>
, per esempio.
Come posso garantire che l'argomento del modello sarà sempre una firma di funzione, in modo che io possa chiamare operator()
su std::function
?
Per favore, puoi aggiornare il codice esattamente come si sta chiamando la classe e come si inizializza la classe? – Jts
Sì, un MCVE effettivo sarebbe d'aiuto. Basta aggiungere un 'main' giocattolo che crea un'istanza del tuo' Class 'quindi esegue' .callFunc() 'e conferma che compila e genera l'errore in MSVC. –
Yakk