C++ overloaded operator with reverse order of associativity

主宰稳场 提交于 2019-12-30 09:19:47

问题


It was very hard to come up with a title... (I'm not a native English speaker.)

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;
}

This code compiles/works as expected, but when I change a=a+2 to a=2+a, it won't compile anymore. GCC gives me this error:

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

Is there any way to somehow make 2+a work just like a+2?


回答1:


You need a free function, defined after the class

struct A
{
   // ...
};

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

also, you might consider defining A& operator+=(int i); in A an implement both versions of operator+ as free functions. You might also be interested in Boost.Operators or other helpers to simplify A, see my profile for two options.




回答2:


Sure, define the inverse operator outside the class:

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;
}



回答3:


The other answers here work fine. However, another option you have is to create a constructor for a single int like this:

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

This allows integers to get implicitly converted, and allows you to only overload operators for your struct instead:

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

Of course, this does allow all integers to get implicitly converted to As, which may or may not be desirable.



来源:https://stackoverflow.com/questions/16118934/c-overloaded-operator-with-reverse-order-of-associativity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!