Beim Kompilieren Sie den folgenden Code:Kann nicht nennen generic std :: function Mitglied von Template-Klasse
#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;
}
Der VS 2015-Compiler generiert die folgende Fehlermeldung bei der sechsten Zeile:
error C2064: term does not evaluate to a function taking 0 arguments.
Jetzt, Ich glaube, das ist, weil der Compiler denkt, functionSignature
ist nicht, nun, eine Funktionssignatur; Derselbe Fehler tritt auf, wenn ich zum Beispiel operator()
auf einem std::function<int>
anstelle von std::function<int()>
instanziiere und versuche, ihn aufzurufen.
Wie kann ich garantieren, dass das Template-Argument immer eine Funktionssignatur ist, so dass ich operator()
auf dem std::function
anrufen kann?
Können Sie bitte den Code genau aktualisieren, wie Sie Ihre Klasse aufrufen und wie Sie Ihre Klasse initialisieren? – Jts
Ja, ein tatsächlicher MCVE würde helfen. Fügen Sie einfach ein Spielzeug 'main' hinzu, das eine Instanz Ihrer' Class> dann '' callFunc() 'darauf, und bestätigen Sie, dass es kompiliert und den Fehler in MSVC generiert. –
Yakk