Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符[]编译器错误和警告_C++ - Fatal编程技术网

C++ 运算符[]编译器错误和警告

C++ 运算符[]编译器错误和警告,c++,C++,可能是因为我整晚都没睡……但是有人能解释一下为什么第一个操作符[](常量一)在MSVC 2010中生成一个警告,说我正在返回一个临时变量的地址,第二个操作符[](非常量一)呢生成一个编译器错误,声明为:“return”:无法从“std::\u Vb\u reference”转换为“bool&” 非常感谢大家,我会在我的问题上浪费时间 class ReqAtts { public: const bool& operator[](size_t ii)

可能是因为我整晚都没睡……但是有人能解释一下为什么第一个操作符[](常量一)在MSVC 2010中生成一个警告,说我正在返回一个临时变量的地址,第二个操作符[](非常量一)呢生成一个编译器错误,声明为:“return”:无法从“std::\u Vb\u reference”转换为“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;

    };
类请求
{
公众:
常数布尔和运算符[](尺寸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数组。无论如何,你的解决方案也很好:)非常感谢!