首页 > 解决方案 > 通过添加 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 但在初始化列表的下一项中再次这样做会导致链接器错误?

标签: c++classstaticg++

解决方案


我猜你的 cpp 文件需要添加:

const int ClassA::xOffset;
const int ClassA::yOffset;

推荐阅读