gpt4 book ai didi

c++ - 模板函数指针 : "overloaded function with no contextual type information"

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:50 24 4
gpt4 key购买 nike

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

失败并出现以下错误

1>StackOverflow.cpp(23): error C2998: 'ret (__cdecl Class::* __cdecl pMf)(Arg1)' : cannot be a template definition

你能做什么

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com