Tengo este problema que me molesta. Tengo la clase FSM qué claves asociados a las devoluciones de llamadaFunciones como parámetros de plantilla problema
class FSM
{
public:
typedef bool (FSM::*InCallback_t)(int);
typedef std::map< std::string, InCallback_t > Table;
// Since I would like to allow the user to register both functors and class member functions
template< typename Callback_t, bool (Callback_t::*CallbackFunct_t)(int) >
bool callback(int x)
{
return (Callback_t().*CallbackFunct_t)(x);
}
void addCallback(const std::string& iKey, InCallback_t iCallback)
{
_table.insert(std::make_pair(iKey, iCallback));
}
[ ... ]
private:
Table _table;
};
y algunas clases de devoluciones de llamada
class CallbackBase
{
public:
bool operator()(int x){ return doCall(x); }
private:
virtual bool doCall(int x){ return true; }
};
class Callback: public CallbackBase
{
private:
bool doCall(int x)
{
std::cout << "Callback\n";
return true;
}
};
Ahora bien, si en el principal hago:
FSM aFSM;
// OK
aFSM.addCallback("one", &FSM::callback< CallbackBase, &CallbackBase::operator() >);
// KO
aFSM.addCallback("two", &FSM::callback< Callback, &Callback::operator() >);
La primera llamada es fina, en el segundo compilador se queja:
Test.cpp: In function ‘int main(int, char**)’:
Test.cpp:104:77: error: no matching function for call to ‘FSM::addCallback(const char [4], <unresolved overloaded function type>)’
Test.cpp:104:77: note: candidate is:
Test.cpp:24:7: note: void FSM::addCallback(const string&, FSM::InCallback_t)
Test.cpp:24:7: note: no known conversion for argument 2 from ‘<unresolved overloaded function type>’ to ‘FSM::InCallback_t’
Observe también que la siguiente es bien
typedef bool (Callback::*Function_t)(int);
Function_t aFunction = &Callback::operator();
(Callback().*aFunction)(5);
Alguna idea? Gracias de antemano por su ayuda.
Simone
Parece una falla del compilador. : | – Nawaz
Sí, supongo que también. Es bastante extraño – Simone
También tuve algunos problemas con las funciones de base (u operadores) con un puntero de función miembro de la clase derivada. En MSVC al menos, simplemente no funciona en las plantillas. – Xeo