1

最初に少し背景を説明します:

テキスト文法ファイルを解析する必要があるプログラミングの課題のために書いています。この場合、a のプレースホルダー文字列をstd::list<string>対応する展開に置き換える必要があります (文字列は文を表します)。

リストを繰り返し処理し、一致する文字列を次のように消去します。

itr = ls.erase(itr)

itr はイテレータで、ls は my ですstd::list<string>

次に、次のような展開を挿入します

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

other は展開を格納するコンテナです。

私の問題は、前の行が明らかに機能しないことです。これはおそらく有効な c++11 構文であり、イテレータが挿入したばかりの先頭を指すようにしたいと思います。insertしかし、明らかに返されるように、コンパイルエラーが発生しますvoid

cplusplus.com で確認しましたが、私が見る限り、使用方法に問題はありません。標準(または少なくとも私が見ることができるもの)は次のように述べています:

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

フラグを指定して g++ (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 ライブラリを完全に実装していないためですか? 彼らはこのビットを見落としましたか?実行するのは難しいとは思われず、それを囲む他のすべての挿入関数は反復子を返します。

あまり手間をかけずにこれを回避できることはわかっていますが、それでも何が起こっているのかを知っておくとよいでしょう。

ありがとう!

明らかこれは私の質問に答えます。お手数をおかけして申し訳ありませんが、以前は見つけられなかったのが残念です。

4

1 に答える 1

2

Libstdc++ は、その関数から反復子を返すように更新されていませんでした。

これは、このパッチによって 2 か月前に Subversion トランクで修正されました: http://gcc.gnu.org/ml/libstdc++/2013-07/msg00000.html

この変更は GCC 4.8.1 のリリース後に行われたものであり、変更が 4.8 ブランチにバックポートされたとは思いません。

于 2013-09-03T08:27:22.403 に答える