重载operator()时遇‘lvalue required as unary & operand’错误求解
解决
&data(0,0)取矩阵首元素地址报错的问题 报错原因
你当前的const版本operator()返回的是矩阵元素的值拷贝(右值),而C++不允许对右值使用取地址运算符&。当data是const mat4<T>类型时,会匹配这个const重载;即使是非const对象,某些场景下也可能意外触发const重载,导致报错。
解决方案
方案1:修改const版本的operator()返回引用
将const重载的返回类型改为const T&,这样无论对象是const还是非const,调用operator()都会得到一个可寻址的左值引用:
template<typename T> const T& mat4<T>::operator()(int i, int j) const { return m[i][j]; } template<typename T> T& mat4<T>::operator()(int i, int j) { return m[i][j]; }
修改完成后,&data(0,0)即可正常获取矩阵首元素的地址,适用于所有mat4<T>对象类型。
方案2:添加专门的data()成员函数
为了更贴合OpenGL API的使用习惯,推荐给mat4类添加一个返回矩阵数据指针的成员函数(这也是主流图形库的常规实现方式):
template<typename T> class mat4 { public: T m[4][4]; // ... 其他成员 ... // 返回const指针,适用于const对象 const T* data() const { return &m[0][0]; } // 返回非const指针,适用于非const对象 T* data() { return &m[0][0]; } // ... 其他成员 ... };
使用时直接调用data.data()作为glUniformMatrix4fv的参数,代码可读性更强,同时避免了运算符重载的潜在陷阱。
内容的提问来源于stack exchange,提问作者luismsfern
相关产品推荐
相关产品推荐

