LNK2001 с использованием std :: vector пользовательской структуры - PullRequest
0 голосов
/ 22 октября 2009

Я хочу иметь кеш данных, который содержит некоторые объекты, которые я могу обновить с помощью функции UpdateCache. Однако у меня возникают проблемы с LNK2001, за которым следует LNK1120.

HeaderFile.h

#ifndef headerfile_included
#define headerfile_included
#include <vector>
struct MyObject {
    unsigned int A;
    unsigned int B;
};
class MyClass {
private:
    static std::vector<MyObject> myObjectCache;
public:
    static void UpdateCache ();
};
#endif

CodeFile.cpp

#include "HeaderFile.h"
void MyClass::UpdateCache () {
    myObjectCache.clear();
    /* Repopulate cache with new data */
}

Сообщение об ошибке, которое я получаю по ссылке:

ошибка LNK2001: неразрешенный внешний символ "" private: статический класс std :: vector> MyClass :: myObjectCache "(? MyObjectCache @ MyClass @@ 0V? $ Vector @ UMyObject @@ V? $ Allocator @ UMyObject @@@ std @@@ станд @@ A)».

фатальная ошибка LNK1120: 1 неразрешенная внешность

Мое мнение таково, что существует некоторая проблема с разбиением на заголовочный файл и файл кода, поскольку у меня были аналогичные проблемы с неправильным разбиением. Если это снова такая проблема, было бы неплохо, если бы вы могли опубликовать какое-то правило о том, что помещать в файл заголовка, а что в файл кода, поскольку это довольно запутанно.

Ответы [ 2 ]

7 голосов
/ 23 октября 2009

Вам необходимо добавить это в файл cpp:

std::vector<MyObject> MyClass::myObjectCache;

Причина в том, что поскольку статика существует без создания экземпляра класса, она должна существовать независимо от того, создан экземпляр класса или нет. Строка выше создает экземпляр статического объекта и, таким образом, существует независимо от того, создаете ли вы когда-либо экземпляр самого класса.

3 голосов
/ 23 октября 2009

Поскольку ваш вектор равен static , по сути, это глобальная сущность в том, что касается компилятора, вам нужно быть уверенным, что это будет дом в модуле компиляции. Вот почему вы должны делать то, что говорит @Goz, и делать

std::vector<MyObject> MyClass::myObjectCache;
...