我需要一个通用函数指针。我在下面编写了这个简单的代码,但是如果我尝试为函数指针赋值, 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;
}
答案 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; :不能是模板定义
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)?这符合你的口味;