C++ 对静态成员的常量引用
我得到错误:main.cpp | 11 |对'Foo::n'的未定义引用。为什么?您使用的编译器版本是什么?看起来,它在C++11方言方面存在一些问题(ideone.com编译成功率为100%) 也许,试试这个是个好主意C++ 对静态成员的常量引用,c++,c++11,reference,static,member,C++,C++11,Reference,Static,Member,我得到错误:main.cpp | 11 |对'Foo::n'的未定义引用。为什么?您使用的编译器版本是什么?看起来,它在C++11方言方面存在一些问题(ideone.com编译成功率为100%) 也许,试试这个是个好主意 struct Foo { constexpr static int n = 10; }; void f(const int &x) {} int main() { Foo foo; f(Foo::n); return 0; } 编译
struct Foo
{
constexpr static int n = 10;
};
void f(const int &x) {}
int main()
{
Foo foo;
f(Foo::n);
return 0;
}
编译器错误是标准要求的。因为你的职能
struct Foo
{
static int n;
};
int Foo::n = 10;
在调用中通过引用获取它的参数
void f(const int& x)
变量Foo::n
使用odr。因此,需要定义
有两种解决方案
1定义Foo::n
:
f(Foo::n);
2按值取f
的参数:
struct Foo
{
constexpr static int n = 10; // only a declaration
};
constexpr int Foo::n; // definition
我使用的是MingWGCC4.7.3。我将把编译器更新到最新版本(4.8.1)并报告结果。谢谢。这似乎是GCC4.8中的一个错误。据我所知,OP的代码不应该编译,MWid的回答说明了原因。@KonradRudolph从技术上讲,这段代码可以编译,但不能链接。对于未定义的静态数据成员的odr使用,标准明确规定“无需诊断”(见§9.4.2/4)。@MWid Ah是的,当然-这显然是有意义的,因为编译器无法诊断。但是当我说“compile”时,我实际上是指整个过程,包括链接。@Yivo为什么我们需要传递静态成员作为引用?仅当类和自由函数在不同的作用域中并且我们对它们进行操作时,它是否有用?或者它在其他方面有用吗?第三种解决方案,如果Foo是一个模板类,并且您不能更改
f
:使用f(+Foo::n)
。
void f(int x);