我从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类,我创建了一个4x4矩阵:
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”文件,如回答其他问题所示,但无济于事。我很感激这向我解释。
答案 0 :(得分:6)
Mat4f::operator[]
是一个非const成员函数,不能在m
的参数Mat4f::Mat4f
上调用,它被声明为const & Mat4f
。
您可以添加另一个const
重载,可以在常量上调用。 e.g。
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];
}