這是交易。我有一個靜態類,其中包含用於獲取輸入的幾個靜態函數。該類包含一個私有靜態成員變量,用於指示用戶是否輸入了任何信息。每種輸入方法都會檢查用戶是否輸入了任何信息,並相應地設置狀態變量。我認爲這將是使用三元運算符的好時機。不幸的是,我不能,因爲編譯器不喜歡那樣。爲什麼靜態成員變量不能和三元運算符一起使用?
我複製了這個問題,然後儘可能簡化我的代碼,以使它易於理解。這不是我的原始代碼。
這是我的頭文件:
#include <iostream>
using namespace std;
class Test {
public:
void go();
private:
static const int GOOD = 0;
static const int BAD = 1;
};
這裏是我的實現與三元運算符:
#include "test.h"
void Test::go() {
int num = 3;
int localStatus;
localStatus = (num > 2) ? GOOD : BAD;
}
這裏的主要功能:
#include <iostream>
#include "test.h"
using namespace std;
int main() {
Test test = Test();
test.go();
return 0;
}
當我嘗試編譯此,我得到這個錯誤信息:
test.o: In function `Test::go()':
test.cpp:(.text+0x17): undefined reference to `Test::GOOD'
test.cpp:(.text+0x1f): undefined reference to `Test::BAD'
collect2: ld returned 1 exit status
但是,如果我替換此:
localStatus = (num > 2) ? GOOD : BAD;
與此:
if (num > 2) {
localStatus = GOOD;
} else {
localStatus = BAD;
}
代碼編譯並運行正常。什麼模糊的C++規則或海灣合作委員會的角落案件負責這種瘋狂? (我使用的是Ubuntu 9.10的GCC 4.4.1。)
標準區分兩種情況在哪裏?難道他們都「使用」「好」,因此需要一個定義?我認爲這只是gcc足夠聰明,以避免在左值'GOOD「被用作賦值RHS的情況下的外部鏈接(因此立即被轉換爲右值),但在這種情況下還沒有管理它在三元運算符中使用的左值「好」,但我準備相信我錯了。 – 2011-03-26 23:23:42
@Steve如果你做了'+ GOOD'或者'int a = GOOD',你可以在左值'好好'(直接)「上做右值轉換 - 參見3.2p2,在這種情況下你不會」使用「變量)。如果你做'int a = x? a:b;',你可以在左值上進行右值轉換,以使三值運算符產生,而不是在a值和b值產生的左值。 – 2011-03-26 23:27:37
啊,你對詹姆斯的評論回答我的問題。它們通過在C++ 03之後插入到草稿中但在2008年出現缺陷之前加以區分。我認爲當前的標準完全符合我的說法。我的打印副本和我的PDF(2003)(E)都說:「如果一個對象或非重載函數的名字出現在潛在評估的表達式中,就會使用它。」沒有例外。 – 2011-03-26 23:30:30