2013-07-15 3 views
2

Казалось бы, что это просто кусок кода должен составлять легко:Неопределенная ссылка станд :: пара

#include <utility> 

struct Q { 
    static const int X = 0; 
}; 

int main() { 
    std::pair<int, int>(Q::X, 0); 
    return 0; 
} 

Однако, когда я компилирую это с g++, используя настройки по умолчанию (Cygwin GCC 4.5.3) он бросает ошибка линкера у меня:

Я полностью озадачен здесь - MSVC компилирует это нормально пока мой НКУ не делает. (MinGW также отлично работает.)

ответ

3

Линкером не найдено определение Q::X.

Это, вероятно, потому, что std::pair<> конструктор принимает аргументы как ссылки на константные и Q::X является L-значение, следовательно, требует внешнего определение Q::X, чтобы иметь возможность ссылаться на это.

Портативный фикс:

int const Q::X; 
+0

Ну, это несчастливо; У меня есть дюжина этих определений 'static const' внутри класса черт (вроде), поэтому было бы довольно сложной задачей дублировать их снаружи. Я думаю, что я просто верну его к значению, поэтому он не пытается взять ссылку. Спасибо за помощь! – Rufflewind

1

Вы только объявить X, но вы должны также определить его, что, для статических определений должно происходить за пределами класса

struct Q { 
static const int X = 0; 
}; 
int Q::X = 0; 
1

@Maxim Егорушкин (Избили меня это!) Here - это релевантная ссылка, которая может помочь.

Но ваша проблема заключается в том, что int никогда не определяется извне. Если X не должен быть const, вы можете инициализировать его вне структуры аналогичным образом. Основная причина в том, что X является статическим ...

struct Q { 
    static const int X; 
}; 
int const Q::X = 0; 

struct Q { 
    static int X; 
}; 
int Q::X = 0; 
Смежные вопросы