加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – constexpr静态数据成员给出未定义的引用错误

发布时间:2020-12-16 09:54:09 所属栏目:百科 来源:网络整理
导读:我正在研究一个内核,我想让我的静态数据成员constexpr,所以我可以在枚举类中使用它的值.但是,如果我这样做,我会得到一个未定义的引用错误.如果我把它变成非constexpr并在类之外初始化它,它似乎才有效. 工作: // terminal.hppclass Terminal{ static uint32_
我正在研究一个内核,我想让我的静态数据成员constexpr,所以我可以在枚举类中使用它的值.但是,如果我这样做,我会得到一个未定义的引用错误.如果我把它变成非constexpr并在类之外初始化它,它似乎才有效.

工作:

// terminal.hpp
class Terminal
{
    static uint32_t col_map[16];
};

// terminal.cpp
uint32_t Terminal::col_map[16] = {
    0x000000,0x0000AA,0x00AA00,0x00AAAA,0xAA0000,0xAA00AA,0xAA5500,0xAAAAAA,0x555555,0x5555FF,0x55FF55,0x55FFFF,0xFF5555,0xFF55FF,0xFFFF55,0xFFFFFF
};

不工作:

// terminal.hpp
class Terminal
{
    constexpr static uint32_t col_map[16] = {
        0x000000,0xFFFFFF
    };

    enum class Color : uint32_t
    {
        Black = col_map[0],White = col_map[15]
    };  
};

请注意,我试图在常规编译器上重现这一点失败,所以我认为它与内核或交叉编译器有关.

链接器错误:

terminal.o: In function `Terminal::drawcolormap()':
terminal.cpp:(.text+0x6f): undefined reference to `Terminal::col_map'

我总是跑得干净;使.

解决方法

如果静态数据成员使用了od-used — period,则应在类外定义.这条规定没有例外.

在数据成员是constexpr的情况下,它也必须在类定义中初始化.但是,这并没有废除在课堂外定义它的要求.

正确的代码:

class Terminal
{
    constexpr static uint32_t col_map[16] = { /* ... */ };
    // ...
};
constexpr uint32_t Terminal::col_map[16]; // definition

这是违反直觉的,但这就是它的方式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读