以下C ++代码编译得很好(使用g++ -c
)但它没有链接给出错误:undefined reference to
Abc :: X'`
#include <iostream>
using namespace std;
class Abc {
public:
const static int X = 99;
};
int main()
{
Abc a1;
cout << &(Abc::X) << endl;
}
我想知道为什么不允许这样做?
答案 0 :(得分:4)
您需要实际定义静态成员,而不仅仅是声明...
在main()
:
const int Abc::X = 99;
从C ++ 17开始,您还可以执行内联静态,在这种情况下,不需要.cpp文件中的上述额外代码行:
class Abc {
public:
inline const static int X = 99; // <-- "inline"
};
答案 1 :(得分:1)
如果您不想考虑翻译单元,静态初始化顺序和类似的东西,只需将静态常量更改为方法。
#include <iostream>
using namespace std;
class Abc {
public:
inline static const int& X(){
static int x=99;
return x;
}
};
int main()
{
// Abc a1;
cout << &(Abc::X()) << endl;
}
答案 2 :(得分:1)
如果以需要左值的方式使用静态成员(即以某种方式要求它具有地址),那么它必须具有定义。请参阅the GCC wiki上的说明,其中包括对标准的引用以及如何解决该问题。