【问题标题】:Problem with static data member - fixing linking error creates a compiler error [closed]静态数据成员的问题-修复链接错误会导致编译器错误[关闭]
【发布时间】:2020-02-26 07:36:26
【问题描述】:

游戏.h:

enum Game_state { MAIN_MENU, /*...*/ };
namespace list { class Linked_list { public: Linked_list() {} }; }

class Game {
    public:
        static Game_state state;
        static list::Linked_list<Obj> objs;
};

Game_state Game::state = MAIN_MENU;
list::Linked_list<Obj> Game::objs = list::Linked_list<Obj>();

这给了我链接器错误:multiple definition of Game::state (and Game::objs)

如果我去掉类型说明符,它会给我编译器错误:'state' in 'class game' does not name a type (same for objs)

我只需要初始化这些成员。

我在 32 位 Windows 10 上使用 mingw。

【问题讨论】:

  • 静态成员定义属于源文件 (.cpp),而不是头文件 (.h)。请出示完整的minimal reproducible example
  • 如果您在头文件中定义变量或函数,它们将在包含头文件的每个translation unit 中定义。函数和变量只需要定义一次。
  • 另一方面,list::linkedlist&lt;obj&gt; game::objs = list::linkedlist&lt;obj&gt;(); 实际上与 list::linkedlist&lt;obj&gt; game::objs; 相同

标签: c++ static linker linker-errors mingw32


【解决方案1】:

您必须将这些定义移动到翻译单元(cpp 文件)中。否则每次在某处包含头文件时都会重新定义它们,从而违反 ODR。

【讨论】:

  • 我不认为是这种情况(我使用包含警卫、#ifndef 等),但我会尝试。
  • @lenerdv 与包含警卫无关。包括守卫仅防止在一个翻译单元内重复,但不能跨多个翻译单元。他们处理不同类型的问题。
【解决方案2】:

将 'game::stat' 和 'game::objs' 的定义放在 *.cpp 文件中并链接。

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多