2

我正在尝试编写一个模板类,该类包含对其模板参数类型的对象的引用,以及指向不返回该类的 arg 成员函数的 void 的指针。'<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&)'|

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

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

4

2 回答 2

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) {}
于 2013-04-05T23:40:29.150 回答
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
{
}
于 2013-04-05T23:42:18.877 回答