Ошибка компоновщика при использовании карты stl - PullRequest
0 голосов
/ 06 февраля 2012

Я получаю следующую ошибку компоновщика:

Ошибка 1, ошибка LNK2001: неразрешенный внешний символ "private: статический класс std :: map, класс std :: allocator>, struct SDL_Surface *, struct std :: less, класс std :: allocator>>, класс std :: allocator, класс std :: allocator> const, struct SDL_Surface *>>> CSurface ::loadedSurfaces "(?loadedSurfaces @ CSurface @@ 0V? $ map @ V? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ распределитель @ D @ 2 @@ станд @@ PAUSDL_Surface @@ U? $ меньше @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@@ 2 @ V? $ распределитель @ U? $ пара @ $$ ОЦК? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@ PAUSDL_Surface @@@ @@@ станд 2 @ @ std @@ A) CSurface.obj

Код для заголовочного файла и файла cpp для модуля компиляции CSurface:

Кодовый пост IdeOne.com

Что вызывает ошибку компоновщика :( это сводит меня с ума.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

CSurface::loadedSurfaces объявлено, но не определено. Добавьте в файл .cpp следующее:

map<string, SDL_Surface*> CSurface::loadedSurfaces;
2 голосов
/ 06 февраля 2012

Вы объявили loadedSurfaces, но не определили его.Чтобы фактически объявить переменную, нужно добавить следующее ровно в одну единицу перевода:

map<string, SDL_Surface*> CSurface::loadedSurfaces;

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

...