stl map const_iterator和g ++错误

时间:2012-08-23 21:20:46

标签: mfc g++ cstring

我正在尝试将一些Windows的MFC类移植到linux,因为我必须将一个Windows软件移植到linux。

这是我需要移植的代码

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中定义)

提前感谢您的帮助!!

2 个答案:

答案 0 :(得分:0)

您的功能签名应为

const char *GetString() const

请注意上一个const

现在,你说,“我正在从非const CString实例返回一个const char指针”。这很好,但是你被要求做的是定义一个可以在 const CString实例上使用的函数 - 这就是最后一个const(在函数参数列表之后)所做的,指定可以在const CString上调用该函数。

您可能需要该函数的两个版本,但特别是,您需要它,因为const_iterator将其内容公开为const对象,而不管它们在容器本身内部是什么。

答案 1 :(得分:0)

GetString的原型应该是:

const char *GetString() const;

第一个const意味着调用者无法修改返回的值。第二个const意味着可以为const CString调用此方法。

另一方面,我也会更改运算符&lt;并使用:

bool operator<(const char *_cstr)