当前位置 : 主页 > 编程语言 > c++ >

c – 下标(“[]”)运算符给出了奇怪的错误

来源:互联网 收集:自由互联 发布时间:2021-06-23
我从visual studio获得了一些奇怪的行为,关于以下代码片段,错误列表显示了E0349的几个实例:没有运算符“[]”匹配这些操作数. Intellisense似乎暗示了类型不匹配,但正如您将在代码中看到的
我从visual studio获得了一些奇怪的行为,关于以下代码片段,错误列表显示了E0349的几个实例:没有运算符“[]”匹配这些操作数.

Intellisense似乎暗示了类型不匹配,但正如您将在代码中看到的那样,没有类型不匹配.

首先,我为了制作mat4而定义了一个Vec4结构:
(我只包括相关功能)

struct Vec4f
{
    union
    {
        struct { float x, y, z, w; };
        struct { float r, g, b, a; };
    };
    // copy constructor
    Vec4f(Vec4f const & v) :
        x(v.x),
        y(v.y),
        z(v.z),
        w(v.w)
    {

    }
    // Operators
    float & operator[](int index)
    {
        assert(index > -1 && index < 4);
        return (&x)[index];
    }

    Vec4f & operator=(Vec4f const & v)
    {
        // If I use: "this->x = v[0];" as above, E0349
        this->x = v.x;
        this->y = v.y;
        this->z = v.z;
        this->w = v.w;
        return *this;
    }    
}

使用上面的Vec4类,我创建了一个4×4矩阵:

struct Mat4f
{
    //storage for matrix values
    Vec4f value[4];

    //copy constructor
    Mat4f(const Mat4f& m)
    {
        value[0] = m[0]; // calling m[0] causes E0349
        value[1] = m[1];
        value[2] = m[2];
        value[2] = m[3];
    }

    inline Vec4f & operator[](const int index)
    {
        assert(index > -1 && index < 4);
        return this->value[index];
    }
}

当调用任何“[]”运算符时,我最终得到这个E0349错误,我不明白这个问题.奇怪的是,该文件编译得很好.我已经尝试删除隐藏的“.suo”文件,如回答其他问题所示,但无济于事.我很感激这向我解释.

Mat4f :: operator []是一个非const成员函数,不能在Mat4f :: Mat4f的参数m上调用,它被声明为const& Mat4f.

你可以添加另一个const重载,可以在常量上调用.例如

inline Vec4f const & operator[](const int index) const
//           ~~~~~                               ~~~~~
{
    assert(-1 < index && index < 4); // As @Someprogrammerdude commented, assert(-1 < index < 4) doesn't do what you expect
    return this->value[index];
}
网友评论