我需要一个通用函数指针。我在下面做了这个简单的代码,但是如果我尝试给函数指针赋值,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;
}
最佳答案
指向成员函数的指针的声明将在您的情况下
void (MyClass::*mf1)(char) = &MyClass::func; // (1)
因此,指向成员函数指针的语法在根本上是不同的。另外,您不能声明模板化的函数指针,因此可以将以上内容转换为模板,以下是非法的
template <class Class, class ret, class Arg1> // (2)
ret (Class::*pMf)(Arg1);
它失败并显示以下错误
你可以做什么
Solution 1:alias 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 :帮助程序结构
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)吗?这取决于您的口味;
关于c++ - 模板函数指针: “overloaded function with no contextual type information”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22967283/