Sto provando a scrivere una funzione modello che accetta uno std::function
che dipende dagli argomenti del modello. Sfortunatamente il compilatore non è in grado di deporre correttamente gli argomenti allo std::function
. Ecco qualche semplice codice di esempio:C++ 11 Funzione modello che utilizza una funzione std :: che dipende dai parametri del modello
#include <iostream>
#include <functional>
using namespace std;
void DoSomething(unsigned ident, unsigned param)
{
cout << "DoSomething called, ident = " << ident << ", param = " << param << "\n";
}
template < typename Ident, typename Param >
void CallFunc(Ident ident, Param param, std::function< void (Ident, Param) > op)
{
op(ident, param);
}
int main()
{
unsigned id(1);
unsigned param(1);
// The following fails to compile
// CallFunc(id, param, DoSomething);
// this is ok
std::function< void (unsigned, unsigned) > func(DoSomething);
CallFunc(id, param, func);
return 0;
}
Se chiamo il modello con il seguente:
CallFunc(id, param, DoSomething);
Ottengo i seguenti errori:
function-tpl.cpp:25: error: no matching function for call to
CallFunc(unsigned int&, unsigned int&, void (&)(unsigned int, unsigned int))
Se creo esplicitamente uno std :: funzione del tipo corretto (o lanciarlo) il problema va via:
std::function< void (unsigned, unsigned) > func(DoSomething);
CallFunc(id, param, func);
Come dovrei codificare questo in modo che il temporaneo esplicito non sia necessario?
Ti sei dimenticato di rimuovere i caratteri del commento "//" prima della riga che causa l'infrazione? Ho GCC4.6.1 e GCC rifiuta la linea. –
@litb * D'OH!* Ben individuato. –