C++ C2071非法存储类,在类中声明并在其他类中使用的外部向量

C++ C2071非法存储类,在类中声明并在其他类中使用的外部向量,c++,visual-studio-2008,vector,extern,C++,Visual Studio 2008,Vector,Extern,错误C2071:“词典::列表”:非法存储类 我有一个类,它将一组字符串读入内存,然后提供函数,允许对这些字符串及其关系应用操作。作为其中的一部分,我希望在main.cpp(其中启动了一些操作)和类(其中完成了操作)之间有一个共享内存。为此,在前一篇文章中,建议使用extern类型。但是,现在有一个错误。如何解决此错误并使多个类共享一个内存空间 在词典中 #ifndef _lexicon_h #define _lexicon_h #include <string&

错误C2071:“词典::列表”:非法存储类

我有一个类,它将一组字符串读入内存,然后提供函数,允许对这些字符串及其关系应用操作。作为其中的一部分,我希望在main.cpp(其中启动了一些操作)和类(其中完成了操作)之间有一个共享内存。为此,在前一篇文章中,建议使用extern类型。但是,现在有一个错误。如何解决此错误并使多个类共享一个内存空间

在词典中

    #ifndef _lexicon_h
    #define _lexicon_h

    #include <string>
    #include <vector>

    using namespace std;

    class Lexicon {
    public:
    Lexicon();
    ~Lexicon();

    extern vector<vector<string>> list;

    void buildVectorFromFile(string filename, vector<vector<string>> &list, int v, int h);

    private:
    struct charT { char letter; nodeT *next;};
    };
    #endif
#ifndef _lexicon_h
#define _lexicon_h

#include <string>
#include <vector>

using namespace std;

class Lexicon {
public:
Lexicon();
~Lexicon();

vector<vector<string>> list;

private:
struct charT { char letter; nodeT *next;};
};
#endif 
\ifndef\u词典
#定义词汇
#包括
#包括
使用名称空间std;
课堂词汇{
公众:
词汇();
~Lexicon();
外部向量表;
void buildVectorFromFile(字符串文件名、向量和列表、int v、int h);
私人:
结构图{char letter;nodeT*next;};
};
#恩迪夫
in main.cpp

#include <string>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>

#include "lexicon.h"  

void buildVectorFromFileHelper (Lexicon & lex)
    {
        vector<vector<string>> list;
        lex.buildVectorFromFile("ASCII.csv", list, 200, 2); //build 2x200 vector list
    }
#include <string>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>

#include "lexicon.h"  

void buildVectorFromFileHelper (Lexicon & lex)
{
    vector<vector<string>> list;
    lex.buildVectorFromFile("ASCII.csv", list, 200, 2); //build 2x200 vector list
}
#包括
#包括
#包括
#包括
#包括
#包括“lexicon.h”
void buildVectorFromFileHelper(词典和lex)
{
向量表;
lex.buildVectorFromFile(“ASCII.csv”,list,200,2);//构建2x200向量列表
}

好的,我误解了你前面的问题(这是当你没有发布完整的代码时会发生的情况)。在类内部,不使用
extern

在词典中

    #ifndef _lexicon_h
    #define _lexicon_h

    #include <string>
    #include <vector>

    using namespace std;

    class Lexicon {
    public:
    Lexicon();
    ~Lexicon();

    extern vector<vector<string>> list;

    void buildVectorFromFile(string filename, vector<vector<string>> &list, int v, int h);

    private:
    struct charT { char letter; nodeT *next;};
    };
    #endif
#ifndef _lexicon_h
#define _lexicon_h

#include <string>
#include <vector>

using namespace std;

class Lexicon {
public:
Lexicon();
~Lexicon();

vector<vector<string>> list;

private:
struct charT { char letter; nodeT *next;};
};
#endif 
lexicon.cpp
中:

vector<vector<string>>  Lexicon::list;
向量词典::列表;

外部内存的规则在此解释;那里的评论是,是的,这应该很简单,但不知何故,这不是直观的。要点是在.cpp文件A中使用extern前缀全局声明内存,然后要在cpp B中重用内存,请在.cpp文件B中再次全局声明它


我认为Luchian_Grigore和@jahhaj已经到达了目的地,但我们要么没有找到让我理解的词语,要么他们仍然在寻找要解释的词语。

我编辑了一个简化的示例,但忘了保留buildVectorFromFile()@Luchian_Grigore,从外部更改为静态,现在有一个LNK2001未解析的外部symbol@forest.peterson对,忘了。请看答案的最后一行。@Luchian_Grigore找到了!它可以编译,请看答案-我尝试了Lexicon::list,但它不允许访问内存。你搞错了。“要点是在.cpp文件中使用extern前缀全局声明内存,然后要重用内存,请在该.cpp文件中再次全局声明它。”-您可以使用
extern
在任何地方声明它。它通常位于标题中,因为您可以在多个位置包含该标题,但它可以位于任何位置。cpp文件中的第二个问题是定义。完全不同。这只能在一个地方。有一个打字错误,我编辑了答案-我无法从标题中获得
extern
内存,尽管这似乎是合乎逻辑的方法。我的回答是这样的。