1

パラメータ述語の条件が値で満たされているかどうかをチェックするイテレータ範囲を超えるテンプレート関数を実装する必要があります。述語条件を満たさない値は、パラメータ挿入イテレータを使用してパラメータ出力にコピーされます。

テンプレート関数の実装をテストするメイン プログラムを作成しました。エラーは返されませんが、大学のテスト プログラムはテンプレート関数の実装でコンパイルされず、次のエラーが発生します。

/usr/include/c++/4.4/debug/safe_iterator.h:272: error: no match for 'operator+=' in '((__gnu_debug::_Safe_iterator<std::__norm::_List_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__debug::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*)this)->__gnu_debug::_Safe_iterator<std::__norm::_List_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__debug::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_current += __n'¶

私の実装は次のとおりです。

template <typename IteratorIn, typename IteratorOut, typename Predicate>
IteratorOut copyIfNot(IteratorIn begin, IteratorIn end, IteratorOut out, Predicate pred) {
    for (IteratorIn iter = begin; iter != end; iter++) {
        if (!pred(*iter)) {
            std::copy(iter, iter + 1, out);
        }
    }

    return out;
}

エラーがどこにあるのか教えてもらえますか?

4

1 に答える 1

1

list::iteratorこれはランダムアクセスイテレータではなく、で使用しているように実装されoperator+ていませんiter + 1

コピーを作成して使用する必要がありますoperator++

auto itercopy = iter;
std::copy(iter, ++itercopy, out);
于 2012-10-14T23:19:54.243 に答える