tipo de función sobrecargada sin resolver

Estoy intentando escribir una clase con plantilla que contiene una referencia a un objeto de su tipo de parámetro de plantilla y un puntero a un vacío que no devuelve ninguna función miembro de arg de esa clase. Sin embargo, recibo un error sobre '' cuando compilo.

 template class memberAction { public: memberAction(void (T::*func)() , T& object); private: void (T::*m_func)(); T& m_object; }; template memberAction::memberAction(void (T::*func)() , T& object) { m_func = func; m_object = object; } class File { public: File(); void TELUNUS_Open(); //memberAction& getOpenAction(); private: memberAction m_OpenAction; }; File::File(): m_OpenAction(TELUNUS_Open,*this)//Line with error on it { } void File::Open() { // } 

comstackndo con g ++ 4.7.2 Recibo el siguiente mensaje de error:

 StackOverloadErrorExample.cpp|31|error: no matching function for call to 'memberAction::memberAction(, File&)'| 

Parece que otras personas con un error similar en el comstackdor están confundiendo los punteros a las funciones globales con los punteros a las funciones miembro, pero declaro específicamente que el constructor toma un puntero a una función miembro de su parámetro de plantilla y le pasa una función miembro del tipo correcto .

Entonces, ¿cómo resuelvo este error del comstackdor?

Creo que necesitas pasar &File::TELUNUS_Open —o &File::Open , el nombre que hayas llamado, para obtener el puntero a la función miembro. Open tiene el tipo de función void (File::)() mientras que &File::Open tiene el tipo que realmente desea, el tipo de puntero de la función void (File::*)() . Más allá de eso, vas a tener problemas con el miembro de referencia m_object . El operador de asignación intentará asignar a una referencia no inicializada:

 template memberAction::memberAction(void (T::*func)() , T& object) { m_func = func; m_object = object; } 

Deberías usar una lista de inicializador de constructor en su lugar:

 template memberAction::memberAction(void (T::*func)() , T& object) : m_func(func), m_object(object) {} 

Esto comstack, creo:

 template< class T > class memberAction { public: memberAction( void (T::*)(), T& ); private: void (T::*m_func)(); T& m_object; }; template< class T > memberAction< T >::memberAction( void (T::*func)(), T& object ) : m_func( func ), m_object( object ) { } class File { public: File(); void TELUNUS_Open() { return; } //memberAction& getOpenAction(); private: memberAction< File > m_OpenAction; }; File::File() : m_OpenAction( &File::TELUNUS_Open, *this ) //Line with error on it { }