运算符[]编译器错误和警告
operator[] compiler error and warning
可能是因为我整晚都没睡。。。但是有人能解释一下为什么第一个运算符[](const运算符)在MSVC 2010中生成一个警告,说我正在返回一个temorary变量的地址,而第二个操作符[](非常数运算符)生成一个编译器错误,说明:"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;
};
std::vector<bool>
在大多数实现(g++,MSVC)中都是节省空间的:每个项都可以存储为单个位,而不是布尔。您可以在这里阅读更多信息: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; };
将参数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;
};
相关文章:
- 警告处理为错误这里有什么问题
- 隐式重新解释引用时强制转换,没有警告/错误
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- 使用 reverse_iterator 而不是const_reverse_iterator并获得讨厌的编译器警告和错误
- GCC 警告和 gcc 错误消息之间的区别
- 在 eclipse 中,将宏重定义视为错误而不是警告
- 在 GCC 中启用"differing levels of indirection"警告/错误
- 当警告为错误时使用 [[已弃用]] 属性 (-Werror)
- G++ 编译器未为未定义的方法生成错误/警告
- 常量更改而不const_cast<> 为什么没有编译器警告/错误?
- 在制作过程结束时显示警告/错误的数量
- 钻石继承方案在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误
- 是否有任何方法可以避免警告/错误模板实例化回溯
- 如何捕获python警告错误并'bury'它?
- OSX:ld:警告:错误符号操作:适用于核心库
- Visual Studio的C4345警告错误吗?
- Visual Studio 上的 CRT SECURE 警告/错误是怎么回事?
- 禁用单个警告错误
- 如何在MSVC中为传递给变分函数的非POD参数启用警告/错误
- 警告错误问题