Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板函数指针:";没有上下文类型信息的重载函数“;_C++_Pointers_Function Pointers - Fatal编程技术网

C++ 模板函数指针:";没有上下文类型信息的重载函数“;

C++ 模板函数指针:";没有上下文类型信息的重载函数“;,c++,pointers,function-pointers,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){} };

我需要一个通用函数指针。我在下面编写了这段简单的代码,但是如果我试图给函数指针赋值,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;
}
class-MyClass{
公众:
void func(char ch){}
};
模板
int Foo(ret(类别:*obj)(Arg1)){
}
int main(int argc,char const*argv[]{
Foo=&MyClass::func;
返回0;
}

成员函数指针的声明将在您的情况下进行

void (MyClass::*mf1)(char) = &MyClass::func; // (1)
因此,指向成员函数的指针的语法基本上是不同的。此外,您不能声明模板化函数指针,因此可以将上述内容转换为模板,以下内容是非法的

template <class Class, class ret, class Arg1> // (2)
ret (Class::*pMf)(Arg1);
模板//(2)
ret(类别:*pMf)(Arg1);
它失败,出现以下错误

1> StackOverflow.cpp(23):错误C2998:“ret(\uu cdecl类::*\uu cdecl pMf)(Arg1)”不能是模板定义

你能做什么 :

模板
使用pMemFun=ret(类::*)(Arg1);
int main()
{
pMemFun pF=&MyClass::func;
返回0;
}
解决方案2:辅助结构

Thnx 2 dyp提供了在gcc中编译的技巧

看看下面的结构

template <class Class, class ret, class Arg1>
struct mFunPtr
{
    typedef ret (Class::*ptr)(Arg1);
};
模板
结构mFunPtr
{
类型定义ret(类别::*ptr)(Arg1);
};
这是一种将指向成员函数的指针类型模板化的变通方法。使用上面的代码将允许

mFunPtr<MyClass, void, char>::ptr fPtr = &MyClass::func; // (3)
mFunPtr::ptr fPtr=&MyClass::func;//(3)

现在,(3)+结构定义比(1)好吗?那取决于你的口味

Foo
是一个函数。通过执行
Foo=&MyClass::func?真的。。。好吧,不管怎样,我会尝试将它修复为通用指针,并在这里写下我得到的…我想你们可能会对函数指针感到困惑。您不能创建“通用”函数指针,因为指向函数的指针和指向成员函数的指针是根本不同的。看这里:嗯,为什么不使用
auto
呢?当然,如果您需要指定一个类型,那么它没有帮助,但是为什么不在这些情况下直接使用
ret(Class::*)(Args…
(而不是
pMemFun
)。顺便说一下,声明“代码>(2)< /C>将是C++中的合法命名空间范围声明。”或者直到有人发现如何在GCC中编译它时,“删除<代码>类型名称< /C> >以使其形成良好的C++。它将使用g++和clang++编译,但不确定MSVC。@dyp Thnx,我相应地给出了答案。我只是提到(2),因为我不能依赖一个尚未发布的标准。至于auto,您说过,它只能解决直接初始化问题。是的,但当您不直接初始化时,即当您需要显式提供某种类型时,为什么要使用类型别名?(我想到的唯一原因是奇怪的
auto pF=pMemFun{&MyClass::func};
)当需要显式类型时,可以直接使用
void(MyClass::*)(char)
。例如:指向成员函数的指针可以是模板函数
F
的参数
A
,并取决于其参数。现在(1)为了便于使用(您可能会发现语法不太容易出错)或(2)如果
F
是可变模板,您可能需要以这种方式将参数包转发到
a
(如果您单击我提供可变模板的链接)
mFunPtr<MyClass, void, char>::ptr fPtr = &MyClass::func; // (3)