C++ glUniforms()和[]运算符重载的问题

C++ glUniforms()和[]运算符重载的问题,c++,opengl,pointers,reference,C++,Opengl,Pointers,Reference,我在编译以下代码时遇到一些问题: GLint iModelMatrix = glGetUniformLocation(m_shaderProgramID, "mvMatrix"); glUniformMatrix4fv(iModelMatrix, 1, GL_FALSE, &myMatrix[0]); GLint iLight = glGetUniformLocation(m_shaderProgramID, "vLightPos"); glUniform3fv(iLight, 1,

我在编译以下代码时遇到一些问题:

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_数据数组的第一个索引的地址吗?这不构成浮动吗

为什么它不满足功能规范

void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
编辑:

好吧,因为我将这些对象作为const references传递给进行上述调用的函数,所以它是按值传递float*数组,因此我不能引用它们

我尝试添加第三个[]运算符:

inline const float& operator[](int index) const    { return m_data[index]; }

但这让我的编译器爆炸了。有什么原因不能这样做吗?

只需将
运算符[]
的结果存储在局部变量中:

float tmp = myMatrix[0];
glUniformMatrix4fv(iModelMatrix, 1, GL_FALSE, &tmp);
这避免了无法作为l值处理的未命名临时值。

这:

inline float  operator[](int index) const   { return m_data[index]; }
应转换为:

inline const float &operator[](int index) const   { return m_data[index]; }
如果要获取返回值的地址。您不需要添加第三个版本;您可以将当前的更改为此。您不能获取临时文件的地址,但可以获取
常量的地址&


就个人而言,我认为您应该有一个特殊的函数,它只返回一个
float*
const float*
,就像C++11使用它一样。这样,您只需调用
myMatrix.data()
,而不必执行
&…[0]
kludge。这是自我记录和显而易见的。

如何声明
myMatrix
myVector
?(它们是否为const?)嗯,既然您提到了它,它们将作为const引用传递给进行这些调用的函数。。。这可能就是问题所在——1:这是非常错误的
glUniformMatrix4fv
接受至少16个浮点数的数组。您正在向它传递一个由一个浮点组成的数组。可能是这样,但这将是所使用函数的语义,而不是语言的规则。问题是关于l值错误。您在原始代码中发现了更多问题-很好。仍然看不到拒绝投票的理由。OP询问了一种方法来获取存储在
myMatrix
中的数组。他没有要求一种方法来获得一个浮动。因此,即使忽略您提供的代码被破坏的事实,它也不能回答问题。背景很重要。