Почему статические переменные-члены плохо сочетаются с тернарным оператором ?

Вот сделка. У меня есть статический класс, который содержит несколько статических функций, используемых для ввода. Класс содержит частную статическую переменную-член, указывающую, ввел ли пользователь какую-либо информацию. Каждый метод ввода проверяет, ввел ли пользователь какую-либо информацию, и соответственно устанавливает переменную состояния. Думаю, сейчас самое время использовать тернарный оператор. К сожалению, я не могу, потому что компилятору это не нравится.

Я воспроизвел проблему, а затем упростил свой код, насколько это было возможно, чтобы облегчить понимание. Это не мой исходный код.

Вот мой заголовочный файл:

#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

Однако, если я заменю this:

localStatus = (num > 2) ? GOOD : BAD;

с этим:

if (num > 2) {
    localStatus = GOOD;
} else {
    localStatus = BAD;
}

Код компилируется и работает должным образом. Какое неясное правило C ++ или угловой случай GCC ответственны за это безумие? (Я использую GCC 4.4.1 в Ubuntu 9.10.)

15
задан Evan Kroske 26 March 2011 в 23:09
поделиться