我正在为文本编辑器创建一个缩进算法。我设法获得了要操作的范围,但是当我想执行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>'转换为'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>'为'const Gtk::TextIter&'作为第一个参数
类TextIter
^
/usr/include/gtkmm-3.0/gtkmm/textiter.h:145:7:注意:候选构造函数(隐式move构造函数)不可行:没有已知的'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>'为'Gtk::TextIter &&'作为第一个参数
类TextIter
^
/usr/include/gtkmm-3.0/gtkmm/textbuffer.h:378:34:注意:此处将参数传递给参数'range_begin'
迭代器擦除(const iterator&range_begin,const iterator&range_end);
有任何想法吗?
最佳答案
我必须使用'boost::iterator_facade'创建一个内部包含模板化'Iterator it'的迭代器类型(在我的情况下是Gtk::TextIter)。除运算符*()外,对迭代器进行的所有转发到“it”的操作都只提供了简单的迭代器。因此擦除是通过以下方式完成的:
buffer->erase(*spaceRange.begin(), *spaceRange.end());
这种新型的迭代器将是非常有用的操纵范围。不确定这是最佳解决方案,但可以。
关于c++ - 使用boost::range创建一个非缩进算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31661020/