这是一个包含某些boost::circular_buffer
的{{1}}的类。我为迭代器创建了一个typedef到包含的struct
中。
我的问题是这样的:当circular_buffer
函数标记为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; });
那么,为什么这个函数不能成为const?为什么标记为const会产生这种副作用?我想在容器中使用非const迭代器,但在我的实际测试用例中,我并不打算实际修改容器。
答案 0 :(得分:7)
您需要F5
,因为您实际上是在观察const_iterator
容器。
也许:
const
...然后将typedef typename boost::circular_buffer<Sample>::const_iterator MyConstIterator;
作为其中之一。
有人会告诉你,你可以通过iter
避免这种情况。这是真的,但是你永远不会发现这个“错误”,或auto
存在。
答案 1 :(得分:4)
如果您的功能已标记为const
,那么您对成员变量的所有访问权限也将为const
。
const
容器只允许访问const_
迭代器,这就像迭代器的工作方式一样。