我有一个包含以下私人成员的课程:
private:
int *vals_;
size_type *cidx_;
std::map< size_type, std::pair<size_t, unsigned int> > ridx_;
现在我试图在operator&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;过载:(注意 m是const )
std::ostream& operator<<(std::ostream &os, const SMatrix &m)
{
os << m.cidx_[0] << endl;
os << m.ridx_[0].first << endl;
return os;
}
我发现m.cidx_ [0]会起作用,但m.ridx_ [0] .first会出错:
错误:传递'const std :: map,std :: less,std :: allocator&gt; &GT; &GT;”作为'_Tp&amp;的''这个'论点std :: map&lt; _Key,_Tp,_Compare,_Alloc&gt; :: operator [](const _Key&amp;)[with _Key = unsigned int,_Tp = std :: pair,_Compare = std :: less,_Alloc = std :: allocator &GT; &gt;]'丢弃限定符
我认为这意味着operator []是一个修改操作符,因此与m是const的事实相矛盾。但是为什么它适用于vals_和cidx_,它们是int和size_type数组?
答案 0 :(得分:7)
std::map::operator[]
会插入一个元素,因此它不能与const
个对象一起使用。数组不是C ++中的类类型,因为它们a[idx]
等同于*(a + idx)
,并且永远不会改变数组本身。
答案 1 :(得分:1)
如果查看map容器的源代码,没有带有const cv限定符的map :: operator [],但你的矩阵对象是const