Из этого сообщения можно понять, что проблема связана с типом параметра, переданного конструктору string
. Несмотря на загадочное упоминание allocator
, вам не составит труда просмотреть различные формы конструкторов string
и убедиться в том, что ни одна из этих форм не вызывается только с аргументом размера.
Кстати, упоминание распределителя памяти (allocator) связано с наличием у всех стандартных контейнеров конструктора, которому передается только распределитель памяти. У типа string
существуют три одноаргументных конструктора, но компилятор по какой-то причине решает, что вы пытаетесь передать именно распределитель. Его предположение ошибочно, а диагностика лишь сбивает с толку.
Что касается конструктора, получающего только распределитель памяти, — пожалуйста, не используйте его; он слишком часто приводит к появлению однотипных контейнеров с неэквивалентными распределителями памяти. Как правило, такая ситуация крайне нежелательна (более подробные объяснения приведены в совете 11).
Рассмотрим пример более сложной диагностики. Предположим, вы реализуете программу для работы с электронной почтой, которая позволяет ссылаться на адресатов не только по адресам, но и по синонимам — скажем, адресу президента США ([email protected]) ставится в соответствие синоним «The Big Cheese». В такой программе может использоваться ассоциативный контейнер для отображения синонимов на адреса электронной почты и функция showEmailAddress
, которая возвращает адрес для заданного синонима:
class NiftyEmailProgram {
private:
typedef map
NicknameMap nicknames;
public:
void showEmailAddress(const string& nickname) const;
};
В реализации showEmailAddress
потребуется найти адрес электронной почты, ассоциированный с заданным синонимом. Для этого может быть предложен следующий вариант:
void NiftyEmail Program::showEmailAddress(const string& nickname) const {
NicknameMap::iterator i = nicknames.find(nickname);
if (i !=nicknames.end)…
}
Компилятору такое решение не понравится. На то есть веская, но не очевидная причина. Чтобы помочь вам разобраться в происходящем, одна из платформ STL услужливо выдает следующее сообщение: