2012-07-25 16 views
1
使用

錯誤C2071:「詞彙::名單」:非法存儲類C2071非法存儲類,外部載體在類中聲明和其他類

我有一個類,上面寫着一串字符串到內存中,然後提供允許對這些字符串及其關係進行操作的函數。作爲其中的一部分,我希望在啓動一些操作的main.cpp和操作完成的類之間有一個共享內存。爲此,在之前的文章中,建議使用extern類型。但是,現在有一個錯誤。我如何解決這個錯誤,並有一個由幾個類共享的內存空間?

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

回答

0

一個外部存儲器的規則在此daniweb thread這裏解釋;有評論說是的,這應該很簡單,但它不直觀。要點是內存在全局聲明時用.cpp文件A中的extern前綴,然後重新使用cpp B中的內存,全局聲明它在.cpp文件B中。

我認爲Luchian_Grigore和@jahhaj獲得但是我們或者沒有找到讓我理解的詞語,或者他們仍然在找到要解釋的詞語。

+0

你搞錯了。 「要點在於內存是在.cpp文件中用extern前綴全局聲明的,然後重新使用內存,然後在該.cpp文件中再次聲明它。」 - 你可以用'extern'聲明任何地方。它通常位於標題中,因爲您可以在多個位置包含該標題,但它可以位於任何位置。在cpp文件中的第二次遇到的是一個定義。完全不同。這隻能在一個地方。 – 2012-07-25 22:52:58

+0

有一個錯字,我編輯了答案 - 我無法從頭文件中獲得'extern'內存,儘管這似乎是合乎邏輯的方法。它適用於我的回答。 – 2012-08-02 23:24:27

2

好吧,我missunderstood你剛纔的問題(這是當你不發佈完整的代碼會發生什麼)。裏面的一類,extern不使用:

在lexicon.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; 
+0

我編輯爲一個簡化的例子,忘了保持buildVectorFromFile() – 2012-07-25 22:13:20

+0

@Luchian_Grigore,從的extern靜態改變,現在具有LNK2001解析的外部符號 – 2012-07-25 22:25:11

+0

@ forest.peterson右,忘了這一點。見答案的最後一行。 – 2012-07-25 22:36:09

相關問題