对静态类成员的未定义引用

对静态类成员的未定义引用

谁能解释为什么以下代码无法编译?至少在g ++ 4.2.4上。

更有趣的是,为什么它会在我将MEMBER转换为int时进行编译?

#include <vector>class Foo {  public:  
    static const int MEMBER = 1;  };int main(){  
    vector<int> v;  
    v.push_back( Foo::MEMBER );       // undefined reference to `Foo::MEMBER'
    v.push_back( (int) Foo::MEMBER ); // OK  
    return 0;}


FFIVE
浏览 769回答 4
4回答

梦里花落0921

如果以某种方式需要定义,则C ++标准需要静态const成员的定义。该定义是必需的,例如,如果使用它的地址。&nbsp;push_back通过const引用获取其参数,因此编译器需要您的成员的地址,您需要在命名空间中定义它。当您显式地转换常量时,您正在创建一个临时的,这是临时的,它绑定到引用(在标准中的特殊规则下)。这是一个非常有趣的案例,我认为值得提出一个问题,以便将std更改为对常常成员具有相同的行为!虽然,以一种奇怪的方式,这可以被视为合法使用一元'+'运算符。基本上,结果unary +是rvalue,因此rvalues绑定到const引用的规则适用,我们不使用静态const成员的地址:v.push_back(&nbsp;+Foo::MEMBER&nbsp;);

杨魅力

Aaa.hclass&nbsp;Aaa&nbsp;{protected: &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;Aaa&nbsp;*defaultAaa;};Aaa.cpp//&nbsp;You&nbsp;must&nbsp;define&nbsp;an&nbsp;actual&nbsp;variable&nbsp;in&nbsp;your&nbsp;program&nbsp;for&nbsp;the&nbsp;static&nbsp;members&nbsp;of&nbsp;the&nbsp;classesstatic&nbsp;Aaa&nbsp;*Aaa::defaultAaa;

HUH函数

您需要在某处(在类定义之后)实际定义静态成员。试试这个:class Foo { /* ... */ };const int Foo::MEMBER;int main() { /* ... */ }那应该摆脱未定义的引用。

慕后森

问题来自于新C ++功能的有趣冲突以及您正在尝试做的事情。首先,我们来看看push_back签名:void&nbsp;push_back(const&nbsp;T&)它期望引用类型的对象T。在旧的初始化系统下,存在这样的成员。例如,以下代码编译得很好:#include&nbsp;<vector>class&nbsp;Foo&nbsp;{public: &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;const&nbsp;int&nbsp;MEMBER;};const&nbsp;int&nbsp;Foo::MEMBER&nbsp;=&nbsp;1;&nbsp;int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<int>&nbsp;v; &nbsp;&nbsp;&nbsp;&nbsp;v.push_back(&nbsp;Foo::MEMBER&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;undefined&nbsp;reference&nbsp;to&nbsp;`Foo::MEMBER' &nbsp;&nbsp;&nbsp;&nbsp;v.push_back(&nbsp;(int)&nbsp;Foo::MEMBER&nbsp;);&nbsp;//&nbsp;OK&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}这是因为某个实际对象的某个值存储在其中。但是,如果切换到指定静态const成员的新方法(如上所述),Foo::MEMBER则不再是对象。这是一个常数,有点类似于:#define&nbsp;MEMBER&nbsp;1但是没有预处理器宏(并且具有类型安全性)的头痛。这意味着期望参考的向量不能得到一个。
打开App,查看更多内容
随时随地看视频慕课网APP