我遇到一些问题需要编译以下代码:
GLint iModelMatrix = glGetUniformLocation(m_shaderProgramID, "mvMatrix");
glUniformMatrix4fv(iModelMatrix, 1, GL_FALSE, &myMatrix[0]);
GLint iLight = glGetUniformLocation(m_shaderProgramID, "vLightPos");
glUniform3fv(iLight, 1, &myVector[0]);
现在myMatrix和myVector是两个对象,每个类都有[]运算符重载,如下所示:
inline float& operator[](int index) { return m_data[index]; }
inline float operator[](int index) const { return m_data[index]; }
我收到以下错误:
error C2102: '&' requires l-value
我正在尝试为什么'&'需要左手边值?我以前传过这样的数据。我不是简单地将地址提供给m_data数组的第一个索引?这不构成浮动*?
为什么它不满足功能规范?
void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
编辑:
好吧,似乎因为我将这些对象作为const引用传递给进行上述调用的函数,它通过值传递float *数组,因此我无法引用它们。
我尝试添加第三个[]运算符:
inline const float& operator[](int index) const { return m_data[index]; }
但这让我的编译器爆炸了。有什么理由不能这样做吗?
答案 0 :(得分:2)
此:
inline float operator[](int index) const { return m_data[index]; }
应该转换到这个:
inline const float &operator[](int index) const { return m_data[index]; }
如果你想获取返回值的地址。你没有添加第三个版本;你将当前的一个改为。您不能使用临时地址,但可以使用const&
的地址。
就我个人而言,我认为你应该有一个只返回float*
或const float*
的特殊功能,就像C ++ 11对std::vector::data所做的那样。这样,您只需致电myMatrix.data()
而不必执行&...[0]
kludge。这是自我记录和明显的。
答案 1 :(得分:-2)
只需将operator[]
的结果存储在本地变量中:
float tmp = myMatrix[0];
glUniformMatrix4fv(iModelMatrix, 1, GL_FALSE, &tmp);
这可以避免不能被视为l值的未命名临时。