静态常量类成员声明
在Foo.h中:
class Foo
{
public:
Foo();
static const unsigned int FOOBAR = 10;
static const unsigned int BARFOO = 20;
private:
unsigned int m_FooBar;
bool m_Bar;
void Bar();
};
在Foo.cpp中:
Foo::Foo()
: m_FooBar(FOOBAR), // this works
m_Bar(false)
{
}
void Foo::Bar()
{
//m_FooBar = m_Bar ? FOOBAR : BARFOO; // linker fails *1
m_FooBar = FOOBAR; // ok
}
我正在编译GCC 4.5.3。 有没有任何理由说明为什么链路* 1未注释时链接器会失败?
Foo.o: In function 'Foo::Bar' (name unmangled):
Foo.cpp: undefined reference to `Foo::FOOBAR'
Foo.cpp: undefined reference to `Foo::BARFOO'
试用VC2005,2008,2010和CB2010。 他们都编译并链接好。 为什么GCC在这种情况下失败?
鉴于这里的答案,为什么其他流行的编译器不像GCC那样失败? 无论如何,它必须是一个bug,无论是GCC还是其他流行的编译器。 还是有更合理的解释?
形式上,头只声明静态常量,并且它们也必须被定义(至少在C ++ 03中)。 但是,如果你只使用他们的价值观,你通常会摆脱这种困境。
在C ++ 11中,当静态为“odr-used”时,这更正式地指定为需要定义。 *1
行就是一个例子。 三元操作符试图形成对值的引用,而编译器(或链接器实际上)意识到它不能。
C ++ 11标准说
9.4.2静态数据成员
§3...
如果在程序中使用odr-use(3.2)并且名称空间作用域定义不包含初始值设定项,该成员仍应在名称空间作用域中定义。
尝试定义这些成员:
static const unsigned int FOOBAR = 10;
static const unsigned int BARFOO = 20;
在类声明之外。
Foo::FOOBAR = 10;
Foo::BARFOO = 20;
链接地址: http://www.djcxy.com/p/63737.html