0

I'm trying to port some windows"s MFC class to linux because I have to port a windows software to linux.

here is the code I need to port

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

and _s$ and SMapCI are defined like this

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

So, here is my CString class

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();};
};

And When I build my code, I get following error:

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

I don't understand this error. g++ documentation say that

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

but ... my GetString function is defined as "const char *", so I have the keyword const ... So I don't get it ... any help will be more than welcome

note: I'm using my own CString class instead of directly changing it with std::string because the code I want to port is too huge, and I want to do the minimum modification on it. (and some function defined in CString are not defined in std::string)

thanks in advance for any help !!

ramone
  • 266
  • 1
  • 2
  • 10

2 Answers2

0

Your function signature should be

const char *GetString() const

Notice the last const.

Right now, you're saying, "I'm returning a const char pointer from a non-const CString instance". This is fine, but what you're being asked to do is define a function that can be used on a const CString instance - and that's what the last const (after the function parameter list) does, specify that that function can be called on a const CString.

You may want both versions of that function, but in particular, you need it here because the const_iterator exposes its contents as const objects, regardless of what they are inside the container itself.

Matt
  • 10,434
  • 1
  • 36
  • 45
0

The prototype of GetString should be:

const char *GetString() const;

The first const means that the caller cannot modify the returned value. The second const means that this method can be called for a const CString.

On the other hand, I would also change the operator< and use:

bool operator<(const char *_cstr)
J. Calleja
  • 4,855
  • 2
  • 33
  • 54