C++ 11中的静态结构在类编译时,为什么不链接?

hel*_*ell 1 c++ c++11

我想提供一些对象的一次性配置.

这段代码:

class Foo
{
  public:
    static struct Bar {
      bool a = true;
      int b = 69;
    } bar;
};

int main(int argc, char **argv)
{
  Foo::bar.a = false;
}
Run Code Online (Sandbox Code Playgroud)

编译得很好:

$ g++ -c -std=gnu++11 main.cpp
Run Code Online (Sandbox Code Playgroud)

但链接器抱怨缺少符号:

$ g++ main.o
Undefined symbols for architecture x86_64:
  "Foo::bar", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

实现同样目标的更好方法是什么?

rub*_*nvb 6

该变量仅在类定义中声明,因此您需要此静态变量的(单个)定义,以及任何其他静态变量:

Foo::Bar Foo::bar;
Run Code Online (Sandbox Code Playgroud)

现场演示.请记住,在您的整个二进制文件中只能存在其中一个定义(无论是库还是可执行文件),因此该定义不能位于可以包含在多个翻译单元(源文件)中的标题中.