我收到了段错误,可以将代码放到这个位置;我初始化一个静态函数指针,它是一个具有相同名称的全局函数的成员:
#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;
[...]
这解决了这个问题。我想知道那里出了什么问题。这是一个范围问题吗?
答案 0 :(得分:3)
void (*def::pt)()=pt;
因为您正在定义def
的静态成员,所以在def
阴影名称中声明的名称是在没有声明的情况下声明的。
您可以通过在全局命名空间中明确指定pt
来选择正确的pt
版本:
void (*def::pt)() = ::pt;
// ^^