我正在尝试将一些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中定义)
提前感谢您的帮助!!
答案 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)