Простите меня, потому что я довольно новичок в С++, но у меня возникают некоторые проблемы с неопределенностью оператора. Я думаю, что это зависит от компилятора, для кода, скомпилированного на моем рабочем столе. Однако он не может скомпилироваться на моем ноутбуке. Я думаю, что знаю, что происходит не так, но я не вижу в нем элегантного пути. Пожалуйста, дайте мне знать, если я сделаю очевидную ошибку. Во всяком случае, вот что я пытаюсь сделать:
Я создал собственный векторный класс 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? Есть ли простой способ обойти это, не связанное с приведением типов? Я просто делаю глупую ошибку? Спасибо за любую помощь заранее.