0

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

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]; }

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

4

2 回答 2

2

这个:

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

应该转换成这样:

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

如果要取返回值的地址。您不添加第三个版本;您将当前的更改为此您不能获取临时地址,但可以获取const&.

float*就个人而言,我认为你应该有一个只返回or的特殊函数,const float*就像 C++11 对std::vector::data所做的那样。这样,您只需跟注myMatrix.data(),而不必&...[0]拼凑。它是自我记录且显而易见的。

于 2012-07-11T22:14:57.270 回答
-2

只需将结果存储operator[]在局部变量中:

float tmp = myMatrix[0];
glUniformMatrix4fv(iModelMatrix, 1, GL_FALSE, &tmp);

这避免了不能被视为左值的未命名临时。

于 2012-07-11T22:04:14.427 回答