0

我正在尝试将一些 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 中定义)

提前感谢您的帮助!

4

2 回答 2

0

您的函数签名应该是

const char *GetString() const

注意最后一个const

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

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

于 2012-08-23T21:24:16.967 回答
0

GetString 的原型应该是:

const char *GetString() const;

第一个 const 表示调用者不能修改返回值。第二个 const 意味着可以为 a 调用此方法const CString

另一方面,我也会更改 operator< 并使用:

bool operator<(const char *_cstr)
于 2012-08-23T21:32:26.083 回答