C++ 模板函数指针:";没有上下文类型信息的重载函数“;
我需要一个通用函数指针。我在下面编写了这段简单的代码,但是如果我试图给函数指针赋值,g++会给我一个错误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){} };
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)