首页 > 解决方案 > c++ static const struct初始化

问题描述

我有一个类可以根据按钮输入改变某些东西的颜色。我想预定义一堆“颜色”,以便状态机可以简单地将标题中定义的常量结构复制到某个变量以更改颜色。

我不明白为什么编译器对以下代码很笨拙,但链接器无法处理它。是否有更好的模式来定义常量结构?我应该让它们成为非静态非常量并忍受它吗?

class ColorManager {
 public:

  ColorManager () {
  }

  // ProcessButton uses the static constexpr structs defined below
  void ProcessButton(uint8_t button_state);

 private:
  // Color_t is defined elsewhere as a struct of R, G, B fields
  static constexpr Color_t kColorWhite  = {100, 100, 100};
  static constexpr Color_t kColorRed    = {100, 0, 0};
  static constexpr Color_t kColorPurple = {100, 0, 70};

};

编辑:这是一个示例错误消息:

src/color_manager.o: In function `ColorManager::ProcessButton(uint8_t button_state)':
color_manager.cc:(.text+0x224): undefined reference to `ColorManager::kColorWhite'
collect2: error: ld returned 1 exit status

标签: c++

解决方案


在 C++17 之前,那些constexpr静态成员声明不是定义。您需要在某个翻译单元中提供定义。

Color_t ColorManager::kColorWhite;

在 C++17 中,这些将是隐式内联变量。


推荐阅读