未解析的重载函数类型

unresolved overloaded function type

本文关键字:函数 类型 重载      更新时间:2023-10-16

我试图写一个模板化的类,它持有一个引用到它的模板参数类型的对象,和一个指针指向一个void返回没有arg成员函数的类。然而,当我编译时,我得到一个关于'<unresolved function type>'的错误。

template<class T>
class memberAction
{
public:
    memberAction(void (T::*func)() , T& object);
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();
    //memberAction<File>& getOpenAction();
private:
    memberAction<File> m_OpenAction;
};
File::File():
        m_OpenAction(TELUNUS_Open,*this)//Line with error on it
{
}
void File::Open()
{ 
    //
}
使用g++ 4.7.2编译

,我得到以下错误消息:

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

似乎其他有类似编译错误的人混淆了指向全局函数的指针和指向成员函数的指针,但我特别声明构造函数作为指向其模板形参的成员函数的指针,并将正确类型的成员函数传递给它。

那么我如何解决这个编译器错误?

我认为您需要传递&File::TELUNUS_Open -或&File::Open,无论您实际调用它的名称-以获得成员函数指针。Open具有函数类型void (File::)(),而&File::Open具有您真正想要的类型,函数指针类型void (File::*)()。除此之外,您还会遇到m_object引用成员的问题。赋值操作符将尝试赋值给未初始化的引用:

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

你应该使用构造函数初始化列表:

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

我相信:

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<File>& getOpenAction();
 private:
  memberAction< File > m_OpenAction;
};
File::File()
    : m_OpenAction( &File::TELUNUS_Open, *this ) //Line with error on it
{
}