C++ 试图调用指向成员函数的函数指针时出现编译时错误
以下是使用指向成员函数的指针的示例:C++ 试图调用指向成员函数的函数指针时出现编译时错误,c++,member-function-pointers,C++,Member Function Pointers,以下是使用指向成员函数的指针的示例: int main(){ struct A { void Foo(){ std::cout << "A::Foo()" << std::endl; } }; void (A::*pFunc)() = &A::Foo; A a; (a.*pFunc)(); // works fine A a2(); pFunc
int main(){
struct A {
void Foo(){
std::cout << "A::Foo()" << std::endl;
}
};
void (A::*pFunc)() = &A::Foo;
A a;
(a.*pFunc)(); // works fine
A a2();
pFunc = &A::Foo;
(a2.*pFunc)(); // This doesn't work?
return 0;
}
卷曲括号初始化<代码> {} /COD>被称为CyralSeriSyLead,它是C++中的首选,因为它可以防止一些明显的错误。比如说
char ch = 1234; // compiles.. though overflows
char ch1 {1234}; // compilation error
代码
A a2();
构造
a2
就好像我们在调用一个函数。。。因此,编译它时无法使用此查找“最麻烦的解析”调用函数指针。使用统一初始化可以防止此问题。@nwp:您能演示一下如何解决吗?@Slava-不要用另一个宽泛语句响应一个宽泛语句。对于大多数用户定义的类型,这是非常好和可取的。@Slava-显然不是。您似乎忘记了一些模板化的代码会乐于接受函数指针并进行编译。因此,现在您仍然有一个运行时错误。这是难以置信的不明显。没有银弹。我是nwp的,至少你知道你有一个类型的对象,总是这样,当你进行统一初始化时。@Slava-你错了。但由于你似乎不愿意把我的经历视为与你同等的经验,这实在是一个未知数。所以我给你一个持续的美好的一天(或者晚安,取决于你所在的地区)。不,它并不总是在蝙蝠上指定一个初始值设定项列表,没有问题。这取决于所构造的类型a2()的问题代码>并不是说它没有提供足够的信息。问题是它声明了一个函数,而不是构造一个a
,这是它的初衷。a a2()
是一个函数声明;它说有一个名为a2
的函数,它不接受任何参数并返回void。它没有构造任何东西。
A a2();