7

很难想出一个标题......(我不是以英语为母语的人。)

struct A
{
    int value;
    A operator+(int i) const
    {
        A a;
        a.value=value+i;
        return a;
    };
};
int main(){
    A a;
    a.value=2;
    a=a+2;
    return 0;
}

此代码按预期编译/工作,但是当我将 a=a+2 更改为 a=2+a 时,它将不再编译。GCC 给了我这个错误:

no match for ”operator+” in ”2 + a”

有没有办法让 2+a 像 a+2 一样工作?

4

3 回答 3

9

你需要一个自由函数,在类之后定义

struct A
{
   // ...
};

A operator+(int i, const A& a)
{
  return a+i; // assuming commutativity
};

此外,您可以考虑A& operator+=(int i);A实现中定义两个版本的operator+自由函数。您可能还对 Boost.Operators 或其他简化帮助程序感兴趣A,请参阅我的个人资料以获取两个选项。

于 2013-04-20T09:55:43.700 回答
4

当然,在类外定义逆运算符:

struct A
{
    int value;
    A operator+(int i) const
    {
        A a;
        a.value=value+i;
        return a;
    };
};
//marked inline to prevent a multiple definition
inline A operator+(int i, const A& a)
{
    return a + i;
}
于 2013-04-20T09:56:19.653 回答
0

这里的其他答案工作正常。但是,您还有另一个选择是为这样的单曲创建一个构造函数int

struct A
{
    int value;
    A(int i) {
        value = i;
    }
};

这允许整数被隐式转换,并允许您只为您的运算符重载struct

A operator+(const A& other) const
{
    // All you need to do is work with an A, and associativity works fine
};

当然,这确实允许所有整数隐式转换为As,这可能是可取的,也可能不是可取的。

于 2019-11-28T00:35:09.800 回答