2017-04-03 55 views
-1

在my.h文件我有這樣的聲明:解析的外部符號「公共靜態結構」

/** 
* XMLReader Class 
* 
* Defines the required function to parse and get data from XML File 
**/ 
class XMLReader { 
public: 


    XMLReader(); 
    ~XMLReader(); 

    static BOOL XmlFinder(WCHAR* argv, const WCHAR* log,const WCHAR* Pass); 
    /** 
    * Get the data from the XML Files 
    * 
    * Returns Boolean if find it 
    */ 

static struct data 
    { 
     WCHAR NumProcess[100]; 
     WCHAR Log[100]; 
     WCHAR Pass[100]; 
     WCHAR Mail[100]; 
     WCHAR memLimit[100]; 
     WCHAR CPULimit[100]; 

    }data; 


}; 

在我.cpp文件我已經定義並inizialized數據結構:

int wmain(int argc, WCHAR* argv[]) 
{ 

    struct XMLReader::data; 

    wmemcpy(XMLReader::data.Log, L"mama", 50); 
    wmemcpy(XMLReader::data.Pass, L"am0r3", 50); 
    wmemcpy(XMLReader::data.CPULimit, L"am0r3", 50); 
    wmemcpy(XMLReader::data.Mail, L"am0r3", 50); 
    wmemcpy(XMLReader::data.NumProcess, L"am0r3", 50); 
    wmemcpy(XMLReader::data.memLimit, L"am0r3", 50); 

但我仍然有VS2013錯誤LNK2001:錯誤3錯誤LNK2001:無法解析的外部符號「public:static struct XMLReader :: data XMLReader :: data」(?data @ XMLReader @@ 2U01 @ A)C:\ Users \ Documents \ Visual Studio 2013 \ Projects \ xmlLiteExample \ C++ \ XmlLiteReader.obj xmllitereaderTask 和

錯誤4錯誤LNK1120:1周無法解析的外部C:\用戶\文檔\的Visual Studio 2013 \項目\ xmlLiteExample \ C++ \調試\ xmllitereaderTask.exe xmllitereaderTask

連連呢?

+0

那麼它看起來像'公共'和'靜態'都拼寫錯誤代碼中的某處。 –

+0

哪裏?也許在標題 – kenhero

+0

@kenhero _unresolved external symbol「** punlic **:** stati ** struct XMLReader :: data on .obj_ – erip

回答

1

在我.cpp文件我已經定義並inizialized數據結構

你沒有。

struct XMLReader::data; 

這是類型struct XMLReader::data;,而不是靜態類成員的定義的重複聲明。這種重新宣佈沒有效果。

XMLReader::data(no struct)是名稱的靜態數據成員。您需要使用的類型和名稱來定義它,你不能在一個函數定義,你必須在文件級別做到這一點:

struct XMLReader::data XMLReader::data; 

不建議使用data作爲名稱爲變量和結構標記。事實上,不建議使用data作爲任何名稱。它不提供任何信息。當然,不要使用任何東西作爲結構變量和變量的名稱。這是令人困惑的,只允許與隱藏的C功能兼容。如果你改變這些事情,不同的事情你可以做這樣的事情:

XMLReader::options_t XMLReader::options = { 
     L"mama", 
     L"am0r3", 
     L"am0r3", 
     L"am0r3", 
     L"am0r3" 
     L"am0r3" 
}; 

這是優於你試圖動態初始化成員,只要你調用未定義行爲(你不能從一個字符串拷貝50個字符只有5)。

最後但並非最不重要的是,不要使用字符數組。使用std::string。如果您必須使用(在Visual Studio中不符合標準的寬字符)寬字符,請使用std::wstring

相關問題