"static const int" вызывает ошибку связывания (undefined -reference)

Я сбиваю с толку ошибку компоновщика при использовании следующего кода:

// static_const.cpp -- complete code
#include <vector>

struct Elem {
    static const int value = 0;
};

int main(int argc, char *argv[]) {
    std::vector<Elem> v(1);
    std::vector<Elem>::iterator it;

    it = v.begin();
    return it->value;
}

Однако это не удается при связывании - каким-то образом он должен иметь символ для значения static const.

$ g++ static_const.cpp 
/tmp/ccZTyfe7.o: In function `main':
static_const.cpp:(.text+0x8e): undefined reference to `Elem::value'
collect2: ld returned 1 exit status

Кстати, это компилирует штраф с -O1 или лучше; но он все еще терпит неудачу в более сложных случаях. Я использую gcc версии 4.4.4 20100726 (Red Hat 4.4.4-13).

Любые идеи, что может быть неправильным с моим кодом?

Ответы

Ответ 1

Если вы хотите инициализировать его внутри структуры, вы также можете сделать это:

struct Elem {
    static const int value = 0;
};

const int Elem::value;

Ответ 2

Попробуйте записать его как

struct Elem {
    static const int value;
};

const int Elem::value = 0;

etc

.

Ответ 3

static члены класса обычно должны быть определены вне класса (объявленного внутри, определенного снаружи) в одном модуле компиляции.

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

Ответ 4

Также см. этот пост: по сути, проблема в том, что каким-то образом компилятор заканчивает тем, что расширяет ваш код, беря адрес Elem:: value.

Ответ 5

Почему бы просто не сделать это?

return Elem::value;

Но ответ заключается в том, что вы присваиваете значение в объявлении. Предполагается, что это работает для базовых типов, таких как int, и требуется только для сложных типов (например, для классов, например, если у вас есть строка вместо int). То, что я нашел на практике, это то, что это поразило или пропустило в зависимости от того, какую версию того компилятора вы используете. И, как вы узнали, какой уровень оптимизации.