2015-07-10 61 views
1

我想提供一个对象的一次性配置。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 
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) 

为什么不这项工作?

and

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

回答

6

变量只宣布类的定义里面,所以你需要这个静态变量的(单)的定义,作为任何其他静态变量:

Foo::Bar Foo::bar; 

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

+0

啊!我认为支撑或平等初始化器会这样做。我会尽快接受...你打赌接受计时器。 – helpwithhaskell

+0

@helpwithhaskell你只能初始化内部类的数据成员,而不能初始化静态类成员'bar'的数据成员。因此,任何代码如:'Foo :: Bar b;'都会将'b'的数据成员初始化为您提供的值,这将是变量'b'的定义,就像上面的'Foo :: Bar Foo :: bar'是Foo(静态成员)变量bar的定义。 – rubenvb

相关问题