繁体   English   中英

静态常量类成员声明

[英]Static constant class member declaration

在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进行编译。 当取消注释第*行时,链接器会失败的原因是什么?

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那样失败? 无论如何,它必须是一个错误,无论是对于GCC还是其他流行的编译器。 还是有更合理的解释?

形式上,标头只声明静态常量,并且还必须定义它们(至少在C ++ 03中)。 但是,如果您只使用它们的值,那么您最常使用它。

在C ++ 11中,这更正式地指定为当静态“使用odr”时需要定义。 *1行就是一个例子。 三元运算符尝试形成对值的引用,并且编译器(或链接器实际上)意识到它不能。


C ++ 11标准说

9.4.2静态数据成员
§3...
如果在程序中使用odr-used(3.2)并且命名空间作用域定义不包含初始化程序,则仍应在名称空间作用域中定义该成员。

尝试定义这些成员:

static const unsigned int FOOBAR = 10;
static const unsigned int BARFOO = 20;

课外宣言。

Foo::FOOBAR = 10;
Foo::BARFOO = 20;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM