可能是因为我整晚都没有睡觉......但是有人可以解释一下为什么第一个操作员[](常规操作员)在MSVC 2010中生成一个警告,说我正在返回一个temorary的地址变量,第二个运算符[](非const运算符)产生一个编译器错误,指出:'return':无法从'std :: _ Vb_reference< _Alloc>'转换'bool&' ?!?!?
非常感谢每个人都会浪费时间在我的问题上。
class ReqAtts
{
public:
const bool& operator[](size_t ii) const
{
return _atts[ii];
}
bool& operator[](size_t ii)
{
return _atts[ii];
}
private:
std::vector<bool> _atts;
};
答案 0 :(得分:1)
std::vector<bool>
在大多数实现中都是节省空间的(g ++,MSVC):每个项目可以存储为单个位,而不是bool。您可以在此处阅读更多内容:en.cppreference.com
您有两个选择:
std::vector<unsigned char>
(或其他整数类型)代替std::vector<bool>
。使用std::vector<bool>::reference
作为operator[]
的返回类型,如下所示:
class ReqAtts
{
public:
std::vector<bool>::const_reference operator[](size_t ii) const
{
return _atts[ii];
}
std::vector<bool>::reference operator[](size_t ii)
{
return _atts[ii];
}
private:
std::vector<bool> _atts;
};
答案 1 :(得分:-1)
将参数att更改为ii,它将起作用
class ReqAtts
{
public:
const bool& operator[](size_t ii) const
{
return _atts[ii];
}
bool& operator[](size_t ii)
{
return _atts[ii];
}
private:
std::vector<bool> _atts;
};