«static const int» вызывает ошибку компоновки (undefined-reference) - PullRequest
14 голосов
/ 01 апреля 2011

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

// 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;
}

Однако это не удается при компоновке - каким-то образом ему необходим символ для статического 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).

Есть идеи, что может быть не так с моим кодом?

Ответы [ 5 ]

8 голосов
/ 01 апреля 2011

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

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

const int Elem::value;
5 голосов
/ 01 апреля 2011

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

struct Elem {
    static const int value;
};

const int Elem::value = 0;

etc

.

2 голосов
/ 07 января 2014

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

2 голосов
/ 01 апреля 2011

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

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

1 голос
/ 01 апреля 2011

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

return Elem::value;

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

...