将静态成员函数指针初始化为同名函数

时间:2016-02-11 08:59:35

标签: c++ function pointers

我收到了段错误,可以将代码放到这个位置;我初始化一个静态函数指针,它是一个具有相同名称的全局函数的成员:

#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;
[...]

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

1 个答案:

答案 0 :(得分:3)

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

因为您正在定义def的静态成员,所以在def阴影名称中声明的名称是在没有声明的情况下声明的。

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

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