这是一个包含某些结构体的
boost::circular_buffer
的类。我对包含的进行了迭代器别名定义(typedef
)。
我的问题在于当doWork
函数被标记为const
时,std::upper_bound
函数的返回值与MyIterator
类型不兼容,因为返回值具有boost::cb_details::const_traits
。如果我从函数中移除const
关键字,则所有编译错误都将消失。
明确一下,编译器错误如下:
error: conversion from ‘boost::cb_details::iterator<boost::circular_buffer<Wrapper<int>::Sample, std::allocator<Wrapper<int>::Sample> >, boost::cb_details::const_traits<std::allocator<Wrapper<int>::Sample> > >’ to non-scalar type ‘Wrapper<int>::MyIterator {aka boost::cb_details::iterator<boost::circular_buffer<Wrapper<int>::Sample, std::allocator<Wrapper<int>::Sample> >, boost::cb_details::nonconst_traits<std::allocator<Wrapper<int>::Sample> > >}’ requested [](const Sample& a, const Sample& b) { return a.foo < b.foo; });
这里有一个自包含的示例:
#include <algorithm>
#include <boost/circular_buffer.hpp>
template <typename T>
class Wrapper {
public:
struct Sample {
T foo;
};
typedef typename boost::circular_buffer<Sample>::iterator MyIterator;
Wrapper(int size) { cb.resize(size); }
void add(T val) { cb.push_back(Sample{val}); }
void doWork(T bound) const {
MyIterator iter =
std::upper_bound(cb.begin(), cb.end(), Sample{3},
[](const Sample& a, const Sample& b) { return a.foo < b.foo; });
}
boost::circular_buffer<Sample> cb;
};
int main() {
Wrapper<int> buf(100);
buf.add(1);
buf.add(5);
buf.doWork(3);
return 0;
}
那么,为什么这个函数不能是const的?标记它为const会导致这种副作用吗?我想要一个非const迭代器进入容器,但在我的实际测试中,我并不打算修改容器。
doWork
是const
的,因此cb
也被视为const
。由于doWork
没有意图修改cb
,请改用const_iterator
。 - Captain Obvliousauto iter = std::upper_bound(...
呢? - Galikauto
,我也赞同,特别是因为这被标记为 c++11。 - TemplateRex