4 回答

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

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;

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

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
但是沒有預處理器宏(并且具有類型安全性)的頭痛。這意味著期望參考的向量不能得到一個。
- 4 回答
- 0 關注
- 810 瀏覽
添加回答
舉報