C++重载()运算符调用报错:表达式需为函数类型的解决方法
Matrix43类重载()运算符的指针调用问题
问题描述
为Matrix43类重载()运算符后,直接通过指针*a调用时触发编译错误:expression preceding parentheses of apparent call must have (pointer-to-) function type。使用引用变量可解决问题,但希望直接通过*a调用以明确是指针指向的对象在执行操作,且项目中main函数存在循环,无法通过构造函数初始化值。
相关代码如下:
Matrix43.h
class Matrix43 { public: Matrix43(); void operator()( double, double, double, double, double, double, double, double, double, double, double, double); private: double m00, m01, m02; double m10, m11, m12; double m20, m21, m22; double m30, m31, m32; };
Matrix43.cpp
#include "Matrix43.h" Matrix43::Matrix43() : m00(0.0), m01(0.0), m02(0.0), m10(0.0), m11(0.0), m12(0.0), m20(0.0), m21(0.0), m22(0.0), m30(0.0), m31(0.0), m32(0.0) { } void Matrix43::operator()( double e00, double e01, double e02, double e10, double e11, double e12, double e20, double e21, double e22, double e30, double e31, double e32) { m00 = e00; m01 = e01; m02 = e02; m10 = e10; m11 = e11; m12 = e12; m20 = e20; m21 = e21; m22 = e22; m30 = e30; m31 = e31; m32 = e32; }
报错的main.cpp
#include "Matrix43.h" Matrix43* a; int main() { a = new Matrix43; // 编译错误:expression preceding parentheses of apparent call must have (pointer-to-) function type *a( -150.0, -100.0, -300.0, 150.0, -100.0, -300.0, -150.0, -100.0, 300.0, 150.0, -100.0, 300.0 ); delete a; return 0; }
可行但不符合需求的main.cpp(使用引用)
#include "Matrix43.h" Matrix43* a; int main() { a = new Matrix43; Matrix43& o = *a; o( -150.0, -100.0, -300.0, 150.0, -100.0, -300.0, -150.0, -100.0, 300.0, 150.0, -100.0, 300.0 ); delete a; return 0; }
原因分析
这是C++运算符优先级导致的问题:函数调用运算符()的优先级高于解引用运算符*,所以代码中的*a(...)会被编译器解析为*(a(...))——即试图将指针a当作函数调用,再对返回值解引用,但a是Matrix43*类型,并非函数指针,因此触发编译错误。
解决方案
只需要给解引用操作加上括号,强制编译器先执行*a得到指针指向的对象,再调用重载的()运算符:
修改后的main.cpp
#include "Matrix43.h" Matrix43* a; int main() { a = new Matrix43; // 给*a加上括号,明确先解引用得到对象 (*a)( -150.0, -100.0, -300.0, 150.0, -100.0, -300.0, -150.0, -100.0, 300.0, 150.0, -100.0, 300.0 ); delete a; return 0; }
另一种等价写法是直接调用重载的operator()成员函数,可读性稍差但同样有效:
a->operator()( -150.0, -100.0, -300.0, 150.0, -100.0, -300.0, -150.0, -100.0, 300.0, 150.0, -100.0, 300.0 );
两种写法都不需要引入额外的引用变量,直接通过指针操作目标对象,符合需求。
内容的提问来源于stack exchange,提问作者ebrebzzeeere
相关产品推荐
相关产品推荐

