| | | | Browse by category |
When I try to compile RWCString's operator[] in MSVC
RWCString str("Hello World."); cout<< str[3];
I get the error error C2666 : 2 overloads have similar conversions.
Cause
In MSVC, RWCString::operator[] is viewed as the global function
char operator[](RWCString, size_t)
A call to str[3] is processed as a call to
char operator[](RWCString, int)
Because there is not an exact match for this function call, the compiler attempts to find a match by using implicit typecasting. The match that we expect:
char operator[](RWCString, size_t)
requires a single typecast from an int to a size_t.
RWCStrings can be typecast into char* by the operator
RWCString::operator const char*() const
Using this typecast, the compiler can also interpret str[3] as
char operator[](char*, int)
through one implicit typecast from an RWCString to a char*. It isn't clear to the compiler which function is best, so it returns the error.
Action
There are two recommended fixes to this problem.
- Always call str[] with an explicit typecast.
- str[(size_t) 3]
- Never require implicit typecasting
- size_t index;
str[index];
These fixes should work in most situations. If the recommended fixes are unacceptable, insert this block of code into your RWCString class definition inside of rw/cstring.h.
inline char operator[](int i)
{
return operator[]((size_t) I);
}