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
的定义一样。