c++ - 通过添加 0 修复对静态成员变量的未定义引用
问题描述
我希望了解 g++ 在尝试链接我的代码时产生的以下错误。有问题的链接错误如下
ClassA.cpp:17: undefined reference to `ClassA::xOffset'
ClassA.cpp:17: undefined reference to `ClassA::yOffset'
此错误来自此行
ClassA::ClassA(int width, int height) : m_width(width - 2 * xOffset),
m_height(height - 2 * yOffset),
---> error here m_classB(50, 300,std::make_tuple(xOffset + m_width, xOffset), std::make_tuple(yOffset + m_height, yOffset))
该错误特别与创建元组有关,并在每个 make_tuple 调用的第二个条目中引用 xOffset 和 yOffset。
查看关于 SO 的其他问题,我注意到人们在不分配静态成员变量时遇到了同样的问题。但是,这是我的班级定义。
class ClassA {
public:
ClassA(int width, int height);
.....
private:
static const int xOffset = 150;
static const int yOffset = 300;
int m_width;
int m_height;
ClassB m_classB;
....
};
xOffset 和 yOffset 都被初始化的地方。
奇怪的是,在解决了错误之后,我可以通过将初始化行更改为此来消除链接错误
ClassA::ClassA(int width, int height) : m_width(width - 2 * xOffset),
m_height(height - 2 * yOffset),
m_classB(50, 300,std::make_tuple(xOffset + m_width, xOffset + 0), std::make_tuple(yOffset + m_height, yOffset + 0))
唯一的变化是将 0 添加到 xOffset 和 yOffset。这消除了链接错误并允许我编译和运行我的代码。
我的问题是为什么添加 + 0 会修复链接错误,为什么我可以在创建 m_width 和 m_height 时在初始化列表中引用静态变量 xOffset 和 yOffset 但在初始化列表的下一项中再次这样做会导致链接器错误?
解决方案
我猜你的 cpp 文件需要添加:
const int ClassA::xOffset;
const int ClassA::yOffset;
推荐阅读
- windows - Windows 调度程序如何加载下一个进程以在 CPU 上运行?
- typo3 - Typo3 选择填充来自 sys_category 的子类别
- puppet - 在模块/lib/facter/* 下的文件中找到的事实将以什么顺序加载到 puppet 客户端上?
- java - 关于使用模拟条带进行 e2e 测试
- visual-studio - 在 Visual Studio 中切换内置目标
- lisp - 递归地将元素添加到列表中的 Lisp 函数
- python - Python/Numpy - 这个 for 循环的矢量化实现?
- batch-file - 如何使用批处理文件更改配置文件 (config.yml) 中的连接字符串?
- javascript - 为什么 connectedCallback 不适用于本机 HTMLElement(不是自定义元素)?
- bash - bash - 在运行其他命令时不运行某些命令?