【发布时间】:2009-06-01 05:42:46
【问题描述】:
我得到了一个典型的“vector4”类,它带有一个操作符 float* 来为 gl*4fv 和 [] 自动转换它。 还有用于编译器优化的“const”版本以及 const 引用,这很好用:
typedef struct vec4
{
...
// ----------------------------------------------------------------- //
// Cast operator, for []
inline operator float* () {
return (float*)this;
}
// Const cast operator, for const []
inline operator const float* () const {
return (const float*)this;
}
// ----------------------------------------------------------------- //
...
// Vertex / Vector
struct {
float x, y, z, w;
};
// Color
struct {
float r, g, b, a;
};
} vec4;
我的问题是当我现在编写一个“matrix4”类时,使用支持的运算符 vec4* 从矩阵中提取行,并且还具有矩阵[][] 运算符的“副作用”,这很好。
typedef struct mat4
{
...
// ----------------------------------------------------------------- //
// Cast operator, for []
inline operator vec4* () {
return (vec4*)this;
}
// Const cast operator, for const []
inline operator const vec4* () const {
return (const vec4*)this;
}
// ----------------------------------------------------------------- //
private:
float f[16];
} mat4;
我的问题是,为什么编译器没有检测到转换 mat4 浮动*?我怀疑 mat4 -> vec4 -> float* 的继承是合理的,但似乎并非如此。 我想到编译器可能会将其视为未定义的 mat4 -> vec4* -> float*, 但是这个假设是无效的,因为定义了操作符
inline operator const vec4 () const {
return (vec4)*this;
}
不起作用,并调用 glMultMatrixf(mat4(...)); (例如)产生与没有运算符时相同的错误消息。
在 mat4 中定义操作符 float* 当然是不可能的,因为这将消除使用 [][] 的能力(二义性操作符)
对此有任何解决方案吗?还是每次我想自动转换为浮动*时都必须手动转换为 vec4?自动投射是一个非常好的功能,它可以巧妙地使用 OpenGL 插入代码。
【问题讨论】:
-
inline在类/结构声明中不需要关键字。 -
如果有一种方法可以为您的问题进行自动转换,那么 [][] 就已经存在一个模棱两可的运算符问题,就像您在 mat4 中定义了运算符 float* 一样。
-
GCC 4.3.x 似乎没有问题,它使用 operator[] 作为 [][] 和 operator const float* 作为 const float* 接受功能。 MSVC 是问题所在,所以我正在寻找另一种解决方法。