3

これの何が問題なのですか:

template <typename T>
std::list<T> & operator+=(std::list<T> & first, std::list<T> const& second)
{
    std::for_each(second.begin(), second.end(), boost::bind(&std::list<T>::push_back, first, _1));

    return first;
}

正常にコンパイルされますが、動作しません。

4

3 に答える 3

6

参照を介して引数/オブジェクトを渡すために使用する必要がありboost::refます。そうしないと、バインドによって内部コピーが作成されます。

std::for_each(
    second.begin(), second.end(),
    boost::bind(&std::list<T>::push_back, boost::ref(first), _1)
);
于 2011-05-21T18:32:40.800 に答える
6

Cat Plus Plus の解決策はうまくいくでしょうが、C++03 でそのようなことを行うための推奨される方法 (今後の標準バージョンでの if ラムダの出現前) は、標準ライブラリのアルゴリズムとファンクターを使用することです。残念ながら、場合によっては非常に複雑になりますが、この場合はより明確なコードを生成すると思います。

std::copy(second.begin(), second.end(), std::back_inserter(first));
于 2011-05-21T18:38:18.777 に答える
3
std::list<T> ls;
std::list<T> ls0;
// ...
ls.insert(ls.end(), ls0.begin(), ls0.end());
于 2011-05-21T18:37:25.837 に答える