模板函数指针:"重载函数,没有上下文类型信息"

时间:2014-04-09 15:30:18

标签: c++ pointers function-pointers

我需要一个通用函数指针。我在下面编写了这个简单的代码,但是如果我尝试为函数指针赋值, g ++ 会给我一个错误。

TestMain.cpp: In function ‘int main(int, const char**)’:
TestMain.cpp:11:21: error: overloaded function with no contextual type information

代码:

class MyClass{
public:
    void func(char ch){}
};

template <class Class, class ret, class Arg1>
int Foo(ret (Class::* obj)(Arg1)){
}

int main(int argc, char const *argv[]){
    Foo = &MyClass::func;
    return 0;
}

1 个答案:

答案 0 :(得分:3)

成员函数指针的声明将在你的情况下

void (MyClass::*mf1)(char) = &MyClass::func; // (1)

因此指向成员函数的指针的语法基本上是不同的。此外,您无法声明模板化的函数指针,因此您可以将上述内容翻译成模板,以下内容是非法的

template <class Class, class ret, class Arg1> // (2)
ret (Class::*pMf)(Arg1);

失败并出现以下错误

  

1&gt; StackOverflow.cpp(23):错误C2998:&#39; ret(__ cdecl Class :: * __cdecl pMf)(Arg1)&#39; :不能是模板定义

你能做什么

Solution 1alias templates

template<typename Class, typename ret, typename Arg1>
using pMemFun = ret (Class::*)(Arg1);

int main()
{
    pMemFun<MyClass, void, char> pF = &MyClass::func;
    return 0;
}

解决方案2 :helper struct

Thnx 2 dyp用于在gcc中编译的提示。

看看以下结构

template <class Class, class ret, class Arg1>
struct mFunPtr
{
    typedef ret (Class::*ptr)(Arg1);
};

这是一种将成员函数指针的类型模板化的解决方法。使用上面的代码将允许像

这样的代码
mFunPtr<MyClass, void, char>::ptr fPtr = &MyClass::func; // (3)

现在,(3)+结构定义是否优于(1)?这符合你的口味;