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
}
}
那么,这个案例的参考说法是什么?我觉得使用它的第二种方式是正确的方法,但我不能说第一种方法是错误的...... 请帮忙,非常感谢...
答案 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看到链接器错误。