C ++重载运算符,具有相反的关联顺序

时间:2013-04-20 09:52:05

标签: c++ operator-overloading associativity

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

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 +工作就像+ 2?

3 个答案:

答案 0 :(得分:7)

你需要一个免费的功能,在类之后定义

struct A
{
   // ...
};

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

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

答案 1 :(得分: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;
}

答案 2 :(得分: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
};

当然,这确实允许所有整数隐式转换为A s,这可能是或不希望的。