Вот сделка. У меня есть статический класс, который содержит несколько статических функций, используемых для получения ввода. Класс содержит закрытую статическую переменную-член для указания, вводил ли пользователь какую-либо информацию. Каждый метод ввода проверяет, ввел ли пользователь какую-либо информацию, и соответственно устанавливает переменную состояния. Я думаю, что сейчас самое время использовать троичный оператор. К сожалению, я не могу, потому что компилятору это не нравится.
Я повторил проблему, затем максимально упростил свой код, чтобы его было легче понять. Это не мой оригинальный код.
Вот мой заголовочный файл:
#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 ++ или угловой случай GCC ответственны за это безумие? (Я использую GCC 4.4.1 в Ubuntu 9.10.)