Próbuję napisać funkcję szablonu, która akceptuje std::function
, która zależy od argumentów szablonu. Niestety kompilator nie jest w stanie poprawnie odseparować argumentów od std::function
. Oto kilka prostych przykładów Kod:C++ 11 Funkcja szablonu, która przyjmuje funkcję std ::, która zależy od parametrów szablonu
#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;
}
Gdybym wywołać szablon z następujących czynności:
CallFunc(id, param, DoSomething);
otrzymuję następujące błędy:
function-tpl.cpp:25: error: no matching function for call to
CallFunc(unsigned int&, unsigned int&, void (&)(unsigned int, unsigned int))
Gdybym jawnie utworzyć std :: funkcja poprawnego typu (lub rzucania go) problem znika:
std::function< void (unsigned, unsigned) > func(DoSomething);
CallFunc(id, param, func);
W jaki sposób mogę zakodować to tak, aby wyraźne tymczasowe nie było potrzebne?
Czy zapomniałeś usunąć znaki komentarza "//" przed linią przerażającą? Mam GCC4.6.1 i GCC odrzuca wspomnianą linię. –
@litb * D'OH!* Dobrze zauważony. –