如何在C ++中使用其类之外的const静态成员变量

时间:2017-11-06 02:56:44

标签: c++ static const

struct Test
{
    const static int VALUE = 10;
    int a;
    int b;
}

class Foo
{
public:
    const Test& GetTest() { return t; }
private:
    Test t;
}

class Bar
{
public:
    void bar() 
    {
        Foo foo;
        int value = foo.GetTest().VALUE; // link error in linux gcc version 4.4.7 (saids undefine reference) and ok in vs2015
        int value = Test::VALUE; // both ok
    }
}

那么,这个案例的参考说法是什么?我觉得使用它的第二种方式是正确的方法,但我不能说第一种方法是错误的...... 请帮忙,非常感谢...

1 个答案:

答案 0 :(得分:1)

您收到链接器错误的原因是您的编译器认为引用使用了TEST::VALUE

这是我的非标准说法,标准称之为 odr-used 。如果编译器可以推断它需要通过其地址访问变量,那么它将被引用使用。必须以这样的方式定义这些变量,即可以在运行时使用它们的地址来访问变量。

在表达式foo.GetTest().VALUE;中,TEST::VALUE odr-used

必须正确定义 odr-used 变量。在您的情况下,您可以使用:

struct Test
{
    const static int VALUE = 10;
    int a;
    int b;
}

const int Test::VALUE;

<强>更新

您的g ++版本似乎有错误。我在桌面上看不到使用g ++ 5.4.0的链接器错误。我没有在ideone.com使用g ++ 6.0.3看到链接器错误。