亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對靜態類成員的未定義引用

對靜態類成員的未定義引用

C++ C
FFIVE 2019-05-27 16:08:38
對靜態類成員的未定義引用誰能解釋為什么以下代碼無法編譯?至少在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;}
查看完整描述

4 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

如果以某種方式需要定義,則C ++標準需要靜態const成員的定義。

該定義是必需的,例如,如果使用它的地址。 push_back通過const引用獲取其參數,因此編譯器需要您的成員的地址,您需要在命名空間中定義它。

當您顯式地轉換常量時,您正在創建一個臨時的,這是臨時的,它綁定到引用(在標準中的特殊規則下)。

這是一個非常有趣的案例,我認為值得提出一個問題,以便將std更改為對常常成員具有相同的行為!

雖然,以一種奇怪的方式,這可以被視為合法使用一元'+'運算符。基本上,結果unary +是rvalue,因此rvalues綁定到const引用的規則適用,我們不使用靜態const成員的地址:

v.push_back( +Foo::MEMBER );


查看完整回答
反對 回復 2019-05-27
?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

Aaa.h

class Aaa {protected:

    static Aaa *defaultAaa;};

Aaa.cpp

// You must define an actual variable in your program for the static members of the classesstatic Aaa *Aaa::defaultAaa;


查看完整回答
反對 回復 2019-05-27
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

您需要在某處(在類定義之后)實際定義靜態成員。試試這個:


class Foo { /* ... */ };


const int Foo::MEMBER;


int main() { /* ... */ }

那應該擺脫未定義的引用。


查看完整回答
反對 回復 2019-05-27
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

問題來自于新C ++功能的有趣沖突以及您正在嘗試做的事情。首先,我們來看看push_back簽名:

void push_back(const T&)

它期望引用類型的對象T。在舊的初始化系統下,存在這樣的成員。例如,以下代碼編譯得很好:

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

這是因為某個實際對象的某個值存儲在其中。但是,如果切換到指定靜態const成員的新方法(如上所述),Foo::MEMBER則不再是對象。這是一個常數,有點類似于:

#define MEMBER 1

但是沒有預處理器宏(并且具有類型安全性)的頭痛。這意味著期望參考的向量不能得到一個。


查看完整回答
反對 回復 2019-05-27
  • 4 回答
  • 0 關注
  • 810 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號