1

错误 C2071:“Lexicon::list”:非法存储类

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

在词典.h

    #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

在 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
    }
4

2 回答 2

2

好的,我误解了您之前的问题(当您不发布完整代码时会发生这种情况)。在类内部,extern不使用:

在词典.h

#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 

在 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
}

这里的问题是Lexicon没有方法buildVectorFromFile,所以你怎么打电话lex.buildVectorFromFile("ASCII.csv", list, 200, 2);

要分享相同vector的内容,如果它是会员,请制作static

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

static vector<vector<string>> list;

private:
struct charT { char letter; nodeT *next;};
};

lexicon.cpp

vector<vector<string>>  Lexicon::list;
于 2012-07-25T22:06:00.650 回答
0

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

我认为 Luchian_Grigore 和 @jahhaj 已经到了那里,但我们要么只是没有找到让我理解的词,要么他们仍在找到要解释的词。

于 2012-07-25T22:49:35.543 回答