未解决的重载函数类型

时间:2013-04-05 23:31:33

标签: c++ templates g++ function-pointers

我正在尝试编写一个模板化类,该类包含对其模板参数类型的对象的引用,以及指向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&)'|

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

那我该如何解决这个编译错误呢?

2 个答案:

答案 0 :(得分:1)

我相信您需要传递&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) {}

答案 1 :(得分:1)

这个编译,我相信:

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
{
}