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は2つのオブジェクトになり、これらの各クラスには、次のように[]演算子がオーバーロードされます。

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 *配列を値で渡すため、参照できません。

3番目の[]演算子を追加してみました。

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

戻り値のアドレスを取得する場合。3番目のバージョンは追加しません。現在のものをこれに変更します。一時的なアドレスを取得することはできませんが、のアドレスを取得することはできますconst&

個人的には、C++11がstd::vector :: dataで行ったように、float*またはを返す特殊な関数が必要だと思います。そうすれば、応急修理をするのではなく、ただ電話するだけです。それは自己文書化されており、明白です。const float*myMatrix.data()&...[0]

于 2012-07-11T22:14:57.270 に答える
-2

operator[]の結果をローカル変数に格納するだけです。

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

これにより、l値として扱うことができない名前のない一時的なものが回避されます。

于 2012-07-11T22:04:14.427 に答える