vec3f 创建的变量不能用[ ]访问元素?

为啥vec3f 创建的变量不能用[ ]访问其中的元素?
编译器是vs2019

  Vec3f in_box = barycentric(pts, P);
            if (in_box.x < 0 || in_box.y < 0 || in_box.z < 0) continue;
            P.z = 0;
            for (int i = 0; i < 3; i++) {
                P.z += pts[i].z * in_box[i];
            }

这里的in_box[i]出错了,想访问第一个元素只能用in_box.x,可是这样在很长的循环里非常麻烦。

vec3f是一个自定义的数据结构,其中没有定义[]运算符,所以不能用[]访问其中的元素。如果想在循环中使用方便访问vec3f中的元素,可以考虑定义[]运算符。假设您有一个vec3f结构体,该结构体存储三个浮点数,分别表示x,y和z坐标:

struct vec3f {
    float x;
    float y;
    float z;
};

如果要在程序中使用这个结构体,您可以声明vec3f类型的变量:

vec3f in_box;

然后您可以使用点运算符来访问vec3f类型的成员:

in_box.x = 1.0;
in_box.y = 2.0;
in_box.z = 3.0;

但是,如果您尝试使用下标运算符访问vec3f类型的成员,将出现错误:

in_box[0] = 1.0;   // 错误:vec3f类型不支持下标运算符

如果您需要使用下标运算符访问vec3f类型的成员,则需要重载下标运算符:

struct vec3f {
    float x;
    float y;
    float z;

    float& operator[](int i) {
        return *(&x + i);
    }
};

vec3f in_box;
in_box[0] = 1.0;   // 正确:vec3f类型重载了下标运算符

首先,是否可以使用[]来访问类的元素取决于该类是否实现了下标运算符(operator[])。因此,如果Vec3f类没有实现下标运算符,则可能会引发编译错误。如果你需要对Vec3f对象使用下标运算符,请确保该类实现了该运算符。
使用下标运算符访问 Vec3f 类型的元素,那么需要定义重载下标运算符。

struct Vec3f {
    float x, y, z;
    float& operator[](int i) {
        return *(&x + i);
    }
};


那奇怪了,Vec 类型都有重载下标运算符的呀,报错了什么?

是否有提示报错,贴下报错信息