Ambigüedad del operador de C ++

Perdóname, porque soy bastante nuevo en C ++, pero tengo algunos problemas con respecto a la ambigüedad del operador. Creo que es específico del compilador, para el código compilado en mi escritorio. Sin embargo, no se compila en mi computadora portátil. Creo que sé lo que está mal, pero no veo una forma elegante de evitarlo. Avíseme si estoy cometiendo un error obvio. De todos modos, esto es lo que estoy tratando de hacer:

He creado mi propia clase de vectores llamada Vector4 que se parece a esto:

class Vector4
{
 private:
   GLfloat vector[4];
 ...
}

Luego tengo estos operadores, que están causando el problema:

operator GLfloat* () { return vector; }

operator const GLfloat* () const { return vector; }

GLfloat& operator [] (const size_t i) { return vector[i]; }

const GLfloat& operator [] (const size_t i) const { return vector[i]; }

Tengo el operador de conversión para poder pasar una instancia de mi clase Vector4 a glVertex3fv, y tengo una suscripción por razones obvias. Sin embargo, las llamadas que implican suscribir el Vector4 se vuelven ambiguas para el compilador:

enum {x, y, z, w}
Vector4 v(1.0, 2.0, 3.0, 4.0);

glTranslatef(v[x], v[y], v[z]);

Aquí están los candidatos:

candidate 1: const GLfloat& Vector4:: operator[](size_t) const
candidate 2: operator[](const GLfloat*, int) <built-in>

¿Por qué trataría de convertir mi Vector4 a GLfloat * primero cuando el operador de subíndice ya está definido en Vector4? ¿Hay alguna forma simple de evitar esto que no implique la conversión de texto? ¿Estoy cometiendo un error tonto? Gracias por cualquier ayuda de antemano.

Respuestas a la pregunta(2)

Su respuesta a la pregunta