Kompilując następujący kod:Nie można wywołać ogólny element std :: function z klasy szablonu
#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;
}
VS 2015 kompilator generuje następujący komunikat o błędzie w wierszu szóstym:
error C2064: term does not evaluate to a function taking 0 arguments.
Teraz Wierzę, że dzieje się tak, ponieważ kompilator uważa, że functionSignature
nie jest, no cóż, podpisem funkcji; ten sam błąd występuje, gdy tworzę instancję i próbuję wywołać na przykład operator()
na std::function<int>
zamiast na std::function<int()>
.
Jak mogę zagwarantować, że argument szablonu zawsze będzie sygnaturą funkcji, abym mógł zadzwonić pod numer operator()
na std::function
?
Czy możesz zaktualizować swój kod dokładnie tak jak ty dzwonisz swoją klasę i jak zainicjować swoją klasę? – Jts
Tak, rzeczywiste MCVE mogłoby pomóc. Po prostu dodaj zabawkę 'main', która tworzy instancję' Class ', następnie wykonaj' .callFunc() 'i potwierdź, że kompiluje i generuje błąd w MSVC. –
Yakk