当我尝试编译这段代码时,为什么g++会报错?
class A {
private:
static A* Aptr[5];
public:
static int A_count;
A() {
Aptr[A_count] = this;
}
};
int A::A_count = 0;
int main() {
A a_;
A b_;
return 0;
}
/tmp/ccrp4BGg.o: In function `A::A()':
try.cpp:(.text._ZN1AC2Ev[_ZN1AC5Ev]+0x18): undefined reference to `A::Aptr'
collect2: error: ld returned 1 exit status
说明
您只声明您的名为 A::Aptr
的静态数据成员,但是为了使用它,因为您在里面A
的构造函数,您必须提供一个定义。
链接器诊断可能会显示 undefined reference ,这可能很难与缺少的定义相关联,但它是在讨论名称和存储位置的内部映射。
换句话说;链接器无法为存储 A::Aptr
的位置找到一个reference(即入口),这是有道理的:Without a definition you haven't given A::APtr
要使用的任何存储。
解决方案
您已经为A::A_count
,如果您对 A::APtr
执行相同的操作,您将准备就绪。
class A {
private:
static A* Aptr[5]; // (1), declaration
public:
static int A_count; // (2), declaration
A() {
Aptr[A_count] = this;
}
};
A* A::APtr[5]; // (3), definition <-- previously missing!
int A::A_count = 0; // (4), definition
注意:您只是询问链接器错误,但我猜您的意思是在构造 类型的对象时增加 A_count
A
,您目前没有做的事情。