LNK2001使用自定义结构的std :: vector

时间:2009-10-22 19:59:08

标签: c++ stl linker-errors

我希望有一些数据缓存,其中包含一些可以通过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:static class std :: vector&gt; MyClass :: myObjectCache“(?myObjectCache @ MyClass @@ 0V?$ vector @ UMyObject @@ V?$ allocator @ UMyObject @@@ std @@@ std @@ A)”。

     

致命错误LNK1120:1个未解析的外部

我的意见是,分区到头文件和代码文件是一个问题,因为我有不正确的分区问题。如果它再次出现这样的问题,那么如果您可以发布一些关于放入头文件的内容以及代码文件中的内容将会很好,因为它非常令人困惑。

2 个答案:

答案 0 :(得分:7)

您需要将其添加到cpp文件中:

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

原因是,由于静态存在而没有实例化类,因此无论是否实例化类的实例,都需要存在。上面的行创建了静态的实例,因此无论你是否创建了类本身的实例,它都存在。

答案 1 :(得分:3)

由于您的向量是 static ,实际上就编译器而言是一个全局实体,因此您需要确保在编译单元中为它提供一个主页。这就是为什么你必须做@Goz所说和做的事情

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