GCC is quite pedantic, so code like this can cause problems:
CORBA::String_var s = ... s[0] += 1;
GCC 3.3 gives the following error (twice!):
file.cc:10: error: ISO C++ says that `char& _CORBA_String_var::operator[](long unsigned int)' and `operator[]' are ambiguous even though the worst conversion for the former is better than the worst conversion for the latter
This has already been reported as a bug in GCC. However, the GCC people say that the error is correct, and the GCC bug was resolved by improving the diagnostic message.
So, what's going on here?
Here's a simple example that elicits the same error message:
struct X { char& operator[](long i); operator char*(); operator const char*() const; }; void f(X &x) { x[0] += 1; }
x[0] is ambiguous, because it could be x.operator[](0) or static_cast<char *>(x)[0].
Unfortunately a CORBA::String_var contains exactly this ambiguity. The best solution is to explicitly disambiguate the call, by stating the type of the literal value:
CORBA::String_var s = ... s[ CORBA::ULong(0) ] += 1;
This may not be pretty, but it's the best way to get it to work.