初始化静态成员函数指向同名函数的指针

Initializing static member function pointer to function of same name

本文关键字:函数 指针 静态成员 初始化      更新时间:2023-10-16

我有段错误,可以将代码归结为这个;我初始化一个静态函数指针,该指针是具有同名全局函数的成员:

#include <iostream>
class def{
        public:
static void (*pt)();
};
void pt()
{
        std::cout << "works" << std::endl;
}
void (*def::pt)()=pt;
main(int argc,char* args[])
{
  std::cout << "pointer is " << def::pt << std::endl;
  def::pt();
}

这给了

pointer is 0
Segmentation fault (core dumped)

因此,启动似乎失败了。如果我现在将初始化中的函数名称更改为其他名称,请说:

[...]        
void pt2()
{
        std::cout << "works" << std::endl;
}
void (*def::pt)()=pt2;
[...]

这样可以解决问题。我想知道那里出了什么问题。这是一个范围界定问题吗?

void (*def::pt)()=pt;    

因为您正在定义 def 的静态成员,所以用 def 表示的影子名称

声明。

您可以通过在全局命名空间中显式指定pt来选择正确的pt版本:

void (*def::pt)() = ::pt;
//                  ^^