使用指向未定义成员函数的指针时未定义的引用

时间:2014-12-07 22:08:18

标签: c++

为什么会导致未定义的引用?

struct A { void f(); };

int main()
{
    auto f = &A::f;
}

在我得到指针之前,是否必须定义函数?为什么会导致链接器错误?

更新:我刚发现用no optimizations进行编译会给出未定义的引用。

2 个答案:

答案 0 :(得分:4)

您希望获取地址为不存在的变量。 (函数,就此而言,是一种常量变量)

你现在拥有的就像一个前瞻性声明。您声明了一个函数但没有实现它(它类似于缺少extern变量)。

地址本身应该在链接期间给出,但是当链接器搜索它时,它就会丢失。

此外,该功能可以在main函数之后实现,甚至可以在其他文件中实现,但编译器在串行处理中一次处理一个文件。因此,编译器无法知道该功能未在任何地方实现。

所以没有编译错误,因为有前向声明,并且名称已知,但是由于使用了函数但没有实现,因此存在链接错误。

答案 1 :(得分:1)

它没有实现,因此该函数不存在,并且链接器无法找到它来获取其地址。而不是:

struct A { void f(); };

使用:

struct A { void f() {} };