2012-08-23 64 views
0

我試圖端口一些窗口「S MFC類Linux,因爲我有端口的Windows軟件的Linux。STL地圖常量性和g ++錯誤

這裏是我需要將代碼移植

165: SMapCI it = _s$.find("nchairs"); 
166: if (it==_s$.end()) return 10; 
167: int n = strtoul(it->second.text.GetString(), NULL, 10); 

和_s $和SMapCI都是這樣

typedef std::map<CString, STablemapSymbol> SMap; 
SMap  _s$; 
typedef SMap::const_iterator SMapCI; 

如此定義,這裏是我的CString類

class CString { 
    protected: 
     std::string str; 

    public: 
     CString(const char *_cstr) { str = _cstr;; }; 
     bool operator<(char *_cstr) const { return str < _cstr;}; 
     const char *GetString() { return str.c_str();}; 
}; 

,當我建立我的代碼,我得到以下錯誤:

CTablemap/CTablemap.h:167:54: error: passing ‘const CString’ as ‘this’ argument of ‘const char* const CString::GetString()’ discards qualifiers [-fpermissive] 

我不明白這個錯誤。 G ++文件說,

passing 'const OBJECT' as 'this' argument of 'FUNCTION' discards qualifiers 
*Message found in GCC version 4.5.1 
*you're returning an address 
*you're attempting to access a container element with a const_iterator using a member function that has no non-const versions. The non-const function does not guarantee it will not alter the data 

但是......我GetString函數被定義爲「爲const char *」,所以我有const關鍵字... 所以我不明白這一點...任何幫助將更受歡迎

注意:我使用我自己的CString類,而不是直接用std :: string改變它,因爲我想要移植的代碼太大了,我想對它做最小的修改。 (和CString中定義的一些函數沒有在std :: string中定義)

在此先感謝您的幫助!

回答

0

你的函數簽名應該是

const char *GetString() const

通知最後const

現在,你說,「我從一個非const const CString實例返回const char指針」。這很好,但你被要求做的是定義一個函數,它可以在CString實例上使用 - 這就是最後一個const(函數參數列表之後)的作用,指定該函數可以是呼籲const CString

您可能需要該功能的兩個版本,但特別是在這裏需要它,因爲const_iterator將其內容公開爲const對象,而不管它們在容器內部。

+0

哦...你是正確的...謝謝:) – ramone

0

的GetString的原型應該是:

const char *GetString() const; 

第一常量意味着該呼叫者不能修改返回值。第二個常量意味着可以調用此方法爲const CString

在另一方面,我也將改變運營商<及用途:

bool operator<(const char *_cstr)