使用多个操作员与操作员重载会产生奇怪的错误

Using multiple operators with operator overloading gives strange error

本文关键字:操作员 错误 重载      更新时间:2023-10-16

我有一个称为floattensor的单个类。我对 和 *的运算符超载。这是代码。


class FloatTensor {
    public:
    float val; // value of tensor 
    float grad; // value of grad
    Operation *frontOp =NULL, *backOp =NULL;
    FloatTensor* two;
    FloatTensor() {
        // default
    }
    FloatTensor(float val) {
        this->val = val;
    }
    FloatTensor(float val, Operation* op) {
        this->val = val;
        this->backOp = op;
    }
    void backward(float grad) {
        this->grad = grad;
        if(this->backOp != NULL) {
            this->backOp->backward(grad);
        }
    }
    FloatTensor exp() {
        this->frontOp = new ExponentOperation(this);
        return this->frontOp->compute();
    }
    FloatTensor operator * (FloatTensor &two) { 
        this->frontOp = new MultiplyOperation(this, &two);
        return this->frontOp->compute();
    }
    FloatTensor operator + (FloatTensor &two) { 
        this->frontOp = new AddOperation(this, &two);
        return this->frontOp->compute();
    }
    FloatTensor operator / (FloatTensor &two) { 
        this->frontOp = new DivideOperation(this, &two);
        return this->frontOp->compute();
    }
};

在我尝试简单的过载时,在我的主要功能中,情况很棒

int main() {
    // X 
    FloatTensor x1(200); // heap declaration
    FloatTensor x2(300);
    // Weights
    FloatTensor w1(222);
    FloatTensor w2(907);
    FloatTensor temp = (x1*w1);
}

但是,当我尝试与更多运算符这样的操作员超载

int main() {
    // X 
    FloatTensor x1(200); // heap declaration
    FloatTensor x2(300);
    // Weights
    FloatTensor w1(222);
    FloatTensor w2(907);
    FloatTensor temp = (x1*w1) + (x2*w2);
}

我得到此错误:

no operator "+" matches these operands -- operand types are: FloatTensor + FloatTensor

如果有人能解释为什么会发生这种情况,我将非常感激。我观察到这有效:

x1*w1*x2*x1;
x1*w1 + x2;

x1*w1 + x2*w2没有。

非常奇怪..

您的操作员接受非const lvalue参考作为参数。临时性不与非const LVALUE参考结合。要接受临时性,请使用:

FloatTensor operator + (const FloatTensor &two)