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();