3

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

#include <utility>

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

int main() {
    std::pair<int, int>(Q::X, 0);
    return 0;
}

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

undefined reference to `Q::X'

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

4

3 回答 3

3

链接器无法找到 的定义Q::X

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

便携式修复:

int const Q::X;
于 2013-07-15T09:14:51.937 回答
1

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

struct Q {
static const int X = 0;
};
int Q::X = 0;
于 2013-07-15T09:25:23.840 回答
1

@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;
于 2013-07-15T09:25:45.353 回答