Я был уверен, что это нужно спросить раньше, но не нашел.
У меня есть класс, инкапсулирующий std :: string, внутри я хочу перегрузить оба приведенных типа в char * и оператор доступа [].
class String
{
public :
String(const char* s) { m_str = s; }
const char* str() const { return m_str.c_str(); }
char* str() { return &m_str[0]; }
char operator[](size_t pos) const { return m_str[pos]; }
char& operator[](size_t pos) { return m_str[pos]; }
operator const char*() const { return str(); } // cast operator
operator char*() { return str(); } // cast operator
protected:
std::string m_str;
};
void main()
{
String s = "1234";
if(s[0] != '1') //'String::operator []': 4 overloads have similar conversions !!!!!
std::cout << "Error" << endl;
}
Проблема, конечно, теперь в том, что когда я пытаюсь использовать String [], я получаю сообщение об ошибке «4 перегрузки имеют похожие преобразования», компилятор не может решить, что из следующего делать:
1) использовать непосредственно оператор перегрузки []
2) сначала преобразовать в char * с помощью operator (), а затем operator [] над массивом char *
Есть ли способ сохранить обоих операторов? Для многих функций и т. Д., Принимающих char * и const char * для использования operstor () строки, но во всех других случаях напрямую operator [] (не пытаясь преобразовать в символ *).
Я полагаю, что ответ на это, вероятно, нет, и поэтому в std :: string нет оператора приведения char *, но, возможно, что-то изменилось в более позднем C ++ стандарты.
РЕДАКТИРОВАТЬ: я могу скомпилировать приведенное выше с помощью GCC, но это не удается с VS (x86). Ошибка C2666 'String :: operator []': 4 перегрузки имеют похожие преобразования.
clang-9
иmscv
, см. gcc.godbolt.org/z/T4yTGH - person Maxim Egorushkin   schedule 22.11.2019