2

テキスト エディター用のインデントなしアルゴリズムを作成しています。操作する範囲を取得できましたが、Gtk::TextBuffer::erase を実行しようとすると失敗します。

void unindentSelection(const Glib::RefPtr<Gtk::TextBuffer> &buffer)
{
    Gtk::TextBuffer::iterator start, end;

    buffer->get_selection_bounds(start, end);

    auto selRange = boost::make_iterator_range(start, end);
    auto buffRange = boost::make_iterator_range(buffer->begin(), buffer->end());

    auto prevRangeRev = boost::make_iterator_range(buffRange.begin(), selRange.begin()) | boost::adaptors::reversed;
    auto prevRangeLineRev = boost::find<boost::return_begin_found>(prevRangeRev, '\n');
    auto prevRangeLine = prevRangeLineRev | boost::adaptors::reversed;

    auto afterRange = boost::make_iterator_range(selRange.end(), buffRange.end());
    auto afterRangeLine = boost::find<boost::return_begin_found>(afterRange, '\n');

    auto exSelRangeAux = boost::join(prevRangeLine, selRange);
    auto exSelRange = boost::join(exSelRangeAux, afterRangeLine);

    show_range(exSelRange);

    while (true)
    {
        auto spaceRange = boost::find_if<boost::return_begin_found>(exSelRange, findNonspaceNL);

        if (boost::distance(spaceRange))
        {
            buffer->erase(spaceRange.begin(), spaceRange.end());
        }
    }
}

TextEditor.cpp:501:31: エラー: 'boost::range_detail::join_iterator >、Gtk::TextIter、unsigned int、unsigned int、boost::iterators::bidirectional_traversal_tag>、Gtk::TextIter、unsigned からの実行可能な変換がありませんint, unsigned int, boost::iterators::bidirectional_traversal_tag>' to 'const iterator' (aka 'const Gtk::TextIter') buffer->erase(spaceRange.begin(), afterRangeLine.end()); ^~~~~~~~~~~~~~~~~~ /usr/include/gtkmm-3.0/gtkmm/textiter.h:145:7: 注: 候補コンストラクター (暗黙のコピー コンストラクター) は実行できません: 'boost::range_detail::join_iterator >、Gtk::TextIter、unsigned int、unsigned int、boost::iterators::bidirectional_traversal_tag>、Gtk::TextIter、unsigned int、unsigned int、boost::iterators からの既知の変換はありません: :bidirectional_traversal_tag>

何か案は?

4

1 に答える 1

1

「boost::iterator_facade」を使用して、内部にテンプレート化された「Iterator it」(私の場合は Gtk::TextIter) を含むイテレーター型を作成する必要がありました。'it' に転送されたイテレータへのすべての操作。したがって、消去は次のように行われました。

buffer->erase(*spaceRange.begin(), *spaceRange.end());

この新しいタイプの反復子は、範囲を操作するのに非常に役立ちます。これが最善の解決策かどうかはわかりませんが、機能します。

于 2015-07-27T22:31:29.540 に答える