2013-09-03 1 views
1

Сначала немного фона:list insert возвращает void для C++ 11, почему?

Я писал для назначения программирования, для чего требуется разбор текстового файла грамматики. В этом случае мне нужно заменить строку-заполнитель в std::list<string> с его соответствующим расширением (строка представляет предложение).

я итерация по списку, и удалите соответствующую строку:

itr = ls.erase(itr) 

где прОш итератор и Ls является моим std::list<string>

Я затем вставить расширение как

itr = ls.insert(itr, other.begin(), other.end()); 

где другой - контейнер, в котором хранится расширение.

Моя проблема в том, что предыдущая строка, по-видимому, не работает. Предположительно, это синтаксис C++ 11, и мне очень хотелось бы, чтобы итератор указывал на начало того, что я только что вставил. Но я получаю ошибки компиляции, так как insert, очевидно, возвращает void.

Я проверил cplusplus.com и as far as i can see, я не вижу ничего плохого в том, как я его использую. The standard (или по крайней мере один, что я могу видеть) гласит:

iterator insert(const_iterator position, InputIterator first, 
    InputIterator last); 

Я компиляции с помощью г ++ (4.8.1) с -std=c++11 флагом, но когда я смотрю на stl_list.h в (gcc-directory)/include/c++/4.8.1/bits я вижу:

void 
    insert(iterator __position, _InputIterator __first,_InputIterator __last) 

Это просто потому, что gcc не полностью реализовала библиотеку C++ 11? Они упустили этот бит? Кажется, что это не сложно, и все остальные функции вставки, связанные с ним, возвращают итератор.

Я знаю, что могу обойти это без лишних хлопот, но все же было бы неплохо узнать, что происходит.

Спасибо!

Редактировать По-видимому this отвечает на мой вопрос. Извините, что беспокою вас, жаль, что я не мог найти его раньше.

+1

«* и стандарт *« Ницца, хотя cppreference.com есть, это * не * «стандарт». Это просто вики. –

+0

ах, спасибо, был немного не уверен в этом. Я довольно новичок в C++, лучшее, что я могу найти бесплатно, будет: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3242.pdf – tang

+2

Я предполагаю, что libstdC++ версия, которая поставляется вместе с GCC 4.8, пока не обновляется. – Xeo

ответ

2

LibstdC++ просто не был обновлен, чтобы вернуть итератор из этой функции.

Это было зафиксировано на стволе диверсии два месяца назад этот патч: http://gcc.gnu.org/ml/libstdc++/2013-07/msg00000.html

Это изменение было сделано после выхода GCC 4.8.1, и я не думаю, что изменение было портированным в 4,8 филиала так или иначе.

+0

Спасибо, я подумал, что может быть так, но я хотел проверить, что это была не просто неисправная или устаревшая библиотека и т. д. – tang