首页 文章

operator []编译器错误和警告

提问于
浏览
0

可能是因为我整晚都没睡觉......但是有人可以解释一下为什么第一个操作符[](常量)在MSVC 2010中生成一个警告,说我正在返回一个临时变量的地址,并且第二个运算符[](非常量运算符)产生一个编译器错误,指出:'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;

    };

2 回答

  • 1

    std::vector<bool> 在大多数实现中是节省空间的(g,MSVC):每个项目可以存储为单个位,而不是bool . 你可以在这里阅读更多:en.cppreference.com

    你有2个选择:

    • 使用 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

    将参数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;
    
        };
    

相关问题