1

我有两个类 A 和 B。产品 A*B 应该是 B 类型。由于 B 类型的变量会占用大量内存,所以我需要避免像这样的操作B_1 = B_1 + (A_1 * B_2),其中(A_1 * B_2)会临时分配。换句话说,我需要B_1 += A_1 * B_2.

我试过这个:

struct A {
    int a;
};

struct B {
    double b[size];

    void operator += (pair<A*, B*> & lhsA_times_rhsB){
        A & lhsA = *lhsA_times_rhsB.first;
        B & rhsB = *lhsA_times_rhsB.second;

        b[lhsA.a] += rhsB.b[lhsA.a];
    }
};

inline pair<A*, B*> operator*( A& lhsA,  B& rhsB){
    return make_pair(&lhsA, &rhsB);
};

int main(){
    A A_in;
    B B_in, B_out;

    pair<A*, B*> product = A_in*B_in;

    B_out += product;    //this works!
    B_out += A_in*B_in;  //doesn't work!? (Compiler: "No viable overloaded '+='")

    return 0;
}
  1. 为什么B_out += product可以,但B_out += A_in * B_in不行?

  2. 有没有更好的方法来实现+=这个用途的 -operator?也许没有定义辅助对象pair<A*, B*>

4

1 回答 1

4

问题是pair<A*, B*>当你乘法时你正在创建一个临时的A_in*B_in

你的签名operator+=

 void operator += (pair<A*, B*> & lhsA_times_rhsB)

您不能从临时创建非常量引用。编译器* (gcc) 会告诉你很多:

错误:无法将“”类型的非常量左值引用绑定到“ ”std::pair<A*, B*>&类型的右值std::pair<A*, B*>

如何阅读错误信息:

'rvalue' 是您从 临时pair<A*, B*>返回的operator*,'non-const lvalue reference' 是目标pair<A*, B*>&

解决方案:

改为operator+=使用 const 引用:

void operator += (const pair<A*, B*>& lhsA_times_rhsB)

您似乎不需要 modify lhsA_times_rhsB,因此您应该更喜欢 constness。

演示

*Clang 的错误消息实际上在这里提供的信息较少,因为它被分成两部分。第一个是“错误:没有可行的重载'+='”,第二个只是稍微更具描述性:“候选函数不可行:第一个参数需要一个左值”

于 2017-07-17T11:55:29.320 回答