【发布时间】:2019-02-14 22:49:39
【问题描述】:
我有一个名为 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 没有。
很奇怪..
【问题讨论】:
-
this->two = &two的原因是什么?为什么要使用指针?这个指针是否会被存储?DivideOperation对象并在很久以后使用(当它们指向的对象超出范围或被破坏时)?为什么指向frontOp?这种动态分配看起来像是内存泄漏。 -
是的,
this->two = two不是必需的。我将删除它,我正在使用frontOp的指针,因为我需要存储对 floatTensor 所经过的操作的引用。这些信息将在以后使用。在函数头中的 FloatTensor 2 前面添加 const 不是一个选项,因为以后可以更改指针。
标签: c++ c++11 operator-overloading