Простите, я довольно новичок в C ++, но у меня возникли некоторые проблемы с неоднозначностью операторов. Я думаю, что это зависит от компилятора, для кода, скомпилированного на моем рабочем столе. Тем не менее, он не может скомпилировать на моем ноутбуке. Я думаю, что знаю, что происходит не так, но я не вижу элегантного способа обойти это. Пожалуйста, дайте мне знать, если я делаю очевидную ошибку. Во всяком случае, вот что я пытаюсь сделать:
Я создал свой собственный векторный класс под названием Vector4, который выглядит примерно так:
class Vector4
{
private:
GLfloat vector[4];
...
}
Тогда у меня есть эти операторы, которые вызывают проблему:
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]; }
У меня есть оператор преобразования, так что я могу передать экземпляр моего класса Vector4 в glVertex3fv, и у меня есть подписка по очевидным причинам. Однако вызовы, которые включают в себя подписку Vector4, становятся для компилятора неоднозначными:
enum {x, y, z, w}
Vector4 v(1.0, 2.0, 3.0, 4.0);
glTranslatef(v[x], v[y], v[z]);
Вот кандидаты:
candidate 1: const GLfloat& Vector4:: operator[](size_t) const
candidate 2: operator[](const GLfloat*, int) <built-in>
Зачем пытаться сначала преобразовать мой Vector4 в GLfloat *, когда оператор индекса уже определен в Vector4? Есть ли простой способ обойти это, который не включает в себя приведение типов? Я просто делаю глупую ошибку? Спасибо за любую помощь заранее.