C++ 运算符[]编译器错误和警告
可能是因为我整晚都没睡……但是有人能解释一下为什么第一个操作符[](常量一)在MSVC 2010中生成一个警告,说我正在返回一个临时变量的地址,第二个操作符[](非常量一)呢生成一个编译器错误,声明为:“return”:无法从“std::\u Vb\u reference”转换为“bool&” 非常感谢大家,我会在我的问题上浪费时间C++ 运算符[]编译器错误和警告,c++,C++,可能是因为我整晚都没睡……但是有人能解释一下为什么第一个操作符[](常量一)在MSVC 2010中生成一个警告,说我正在返回一个临时变量的地址,第二个操作符[](非常量一)呢生成一个编译器错误,声明为:“return”:无法从“std::\u Vb\u reference”转换为“bool&” 非常感谢大家,我会在我的问题上浪费时间 class ReqAtts { public: const bool& operator[](size_t 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;
};
类请求
{
公众:
常数布尔和运算符[](尺寸ii)常数
{
返回(附件[ii];
}
bool和操作员[](尺寸为ii)
{
返回(附件[ii];
}
私人:
std::vector_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;
};
类请求
{
公众:
常数布尔和运算符[](尺寸ii)常数
{
返回(附件[ii];
}
bool和操作员[](尺寸为ii)
{
返回(附件[ii];
}
私人:
std::vector_atts;
};
std::vector
在大多数实现中都是节省空间的(g++,MSVC):每个项都可以存储为单个位,而不是bool。您可以在此处阅读更多内容:
您有两种选择:
std::vector
(或其他整数类型)代替std::vector
std::vector::reference
作为运算符[]
的返回类型,如下所示:
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;
};
类请求
{
公众:
std::vector::const_参考运算符[](size_t ii)const
{
返回(附件[ii];
}
std::vector::reference操作符[](size_t ii)
{
返回(附件[ii];
}
私人:
std::vector_atts;
};
我立刻注意到的一件事是,在第二个函数中,您的参数是“ATT”,但您将索引“II”放进数组中。<代码>:ST::vector < /COD>实际上被视为C++中的特例。应该有助于解释原因。非常感谢huu提供的有用链接:)考虑到_atts向量是静态的(必须始终具有相同的维度…九,它非常小),最好的选择是使用一个好的旧c数组。无论如何,你的解决方案也很好:)非常感谢!