未定义的引用std::对

Undefined reference std::pair

本文关键字:std 引用 未定义      更新时间:2023-10-16

人们会认为这段简单的代码应该很容易编译:

#include <utility>
struct Q {
    static const int X = 0;
};
int main() {
    std::pair<int, int>(Q::X, 0);
    return 0;
}

然而,当我使用默认设置(cygwin gcc 4.5.3)用g++编译它时,它会向我抛出一个链接器错误:

undefined reference to `Q::X'

我在这里完全被难住了——MSVC编译得很好,但我的gcc却没有。(MinGW也很好。)

链接器找不到Q::X的定义。

这可能是因为std::pair<>构造函数将参数作为常量的引用,而Q::X是一个l值,因此需要Q::X的外部定义才能引用它。

便携式修复程序:

int const Q::X;

您只声明X,但还必须定义它,对于静态定义,这必须发生在类之外

struct Q {
static const int X = 0;
};
int Q::X = 0;

@Maxim Yegorushkin(别烦我!)这里有一个相关的链接可能会有所帮助。

但您的问题是,int从来都不是外部定义的。如果X不必是const,那么可以用类似的方式在结构外部初始化它。主要原因是因为X是静态的。。。

struct Q {
   static const int X;
};
int const Q::X = 0;
struct Q {
   static int X;
};
int Q::X = 0;