我需要一个通用函数指针。我在下面做了这个简单的代码,但是如果我尝试给函数指针赋值,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/

10-11 22:59
查看更多