Метод вставки std :: string имеет неоднозначные перегрузки? - PullRequest
5 голосов
/ 12 мая 2010

Среда: VS2005 C ++ с использованием STLPort 5.1.4.

Компилирование следующего фрагмента кода:

std::string copied = "asdf";
char ch = 's';
copied.insert(0,1,ch);

Я получаю сообщение об ошибке:

Error   1   error C2668: 'stlpx_std::basic_string<_CharT,_Traits,_Alloc>::insert' : ambiguous call to overloaded function   

Похоже, что проблема заключается в вызове метода вставки для строкового объекта.

Две определенные перегрузки:

void insert ( iterator p, size_t n, char c );
string& insert ( size_t pos1, size_t n, char c );

Но, учитывая, что STLPort использует простой символ * в качестве итератора, буквенный ноль в методе вставки в моем коде неоднозначен.

Так что пока я легко могу преодолеть проблему, намекнув , например

copied.insert(size_t(0),1,ch);

Мой вопрос: является ли эта перегрузка и возможная неоднозначность преднамеренной в спецификации? Или, скорее, непреднамеренный побочный эффект конкретной реализации STLPort?

(Обратите внимание, что поставляемый Microsoft STL не имеет этой проблемы, поскольку у него есть класс для итератора вместо голого указателя)

Ответы [ 3 ]

1 голос
/ 12 мая 2010

Известная проблема под правилом "Не дефект". http://std.dkuug.dk/jtc1/sc22/wg21/docs/lwg-closed.html#84

0 голосов
/ 12 мая 2010

Преднамеренное или нет, проблема больше связана с семантикой 0, чем рассматриваемые функции-члены. Возможно, дизайнеры библиотеки Microsoft (они использовали Dinkumware в прошлый раз, когда я проверял) были более осторожны в этом отношении.

0 голосов
/ 12 мая 2010

Если вы различаете тип целых разностных чисел, двусмысленность отсутствует .

Команды надлежащей практики для хранения размеров буфера в типах size_t (или ssize_t), а не int.

Если вы согласны с этим, вызывать insert(int, int, char) не имеет смысла, так как два первых аргумента должны быть "размерами буфера".

Если бы не было неявного преобразования из int в size_t, вы даже не могли бы назвать insert() таким образом.

...