Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11类中的静态结构编译,为什么赢了';是链接吗?_C++_C++11 - Fatal编程技术网

C++ C++;11类中的静态结构编译,为什么赢了';是链接吗?

C++ C++;11类中的静态结构编译,为什么赢了';是链接吗?,c++,c++11,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; } 编译得很好: $ g++ -c -std=gnu++11 main.cpp 但链接器抱怨缺少符号: $ g++ main.o Undefin

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

此代码:

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

int main(int argc, char **argv)
{
  Foo::bar.a = false;
}
编译得很好:

$ g++ -c -std=gnu++11 main.cpp
但链接器抱怨缺少符号:

$ 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)
为什么这样不行

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

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

Foo::Bar Foo::bar;
。请记住,在整个二进制文件(无论是库还是可执行文件)中只能有其中一个定义,因此此定义不能包含在可从多个翻译单元(即源文件)中包含的头中。

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

Foo::Bar Foo::bar;

。请记住,在整个二进制文件(无论是库还是可执行文件)中,这些定义只能有一个,因此此定义不能包含在可以从多个翻译单元(即源文件)中包含的标题中。

Ah!我以为大括号或相等的初始值设定项会这样做。我会尽快接受,…您打赌接受计时器。@helpwithhaskell您只初始化内部类的数据成员,而不会初始化静态类成员
bar
。所以任何代码,比如:
Foo::Bar b
将把
b
的数据成员初始化为您提供的值,这将是变量
b
的定义,就像上面的
Foo::Bar Foo::Bar
是Foo的(静态成员)变量
Bar
的定义一样。啊!我以为大括号或相等的初始值设定项会这样做。我会尽快接受,…您打赌接受计时器。@helpwithhaskell您只初始化内部类的数据成员,而不会初始化静态类成员
bar
。所以任何代码,比如:
Foo::Bar b
将把
b
的数据成员初始化为您提供的值,这将是变量
b
的定义,就像上面的
Foo::Bar Foo::Bar
是Foo的(静态成员)变量
Bar
的定义一样。