4 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果以某種方式需要定義,則C ++標(biāo)準(zhǔn)需要靜態(tài)const成員的定義。
該定義是必需的,例如,如果使用它的地址。 push_back
通過const引用獲取其參數(shù),因此編譯器需要您的成員的地址,您需要在命名空間中定義它。
當(dāng)您顯式地轉(zhuǎn)換常量時(shí),您正在創(chuàng)建一個(gè)臨時(shí)的,這是臨時(shí)的,它綁定到引用(在標(biāo)準(zhǔn)中的特殊規(guī)則下)。
這是一個(gè)非常有趣的案例,我認(rèn)為值得提出一個(gè)問題,以便將std更改為對常常成員具有相同的行為!
雖然,以一種奇怪的方式,這可以被視為合法使用一元'+'運(yùn)算符?;旧?,結(jié)果unary +
是rvalue,因此rvalues綁定到const引用的規(guī)則適用,我們不使用靜態(tài)const成員的地址:
v.push_back( +Foo::MEMBER );

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
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;

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
您需要在某處(在類定義之后)實(shí)際定義靜態(tài)成員。試試這個(gè):
class Foo { /* ... */ };
const int Foo::MEMBER;
int main() { /* ... */ }
那應(yīng)該擺脫未定義的引用。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
問題來自于新C ++功能的有趣沖突以及您正在嘗試做的事情。首先,我們來看看push_back
簽名:
void push_back(const T&)
它期望引用類型的對象T
。在舊的初始化系統(tǒng)下,存在這樣的成員。例如,以下代碼編譯得很好:
#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;}
這是因?yàn)槟硞€(gè)實(shí)際對象的某個(gè)值存儲在其中。但是,如果切換到指定靜態(tài)const成員的新方法(如上所述),Foo::MEMBER
則不再是對象。這是一個(gè)常數(shù),有點(diǎn)類似于:
#define MEMBER 1
但是沒有預(yù)處理器宏(并且具有類型安全性)的頭痛。這意味著期望參考的向量不能得到一個(gè)。
- 4 回答
- 0 關(guān)注
- 814 瀏覽
添加回答
舉報(bào)