You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:04:56