很难想出一个标题......(我不是母语为英语的人。)
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?
答案 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,这可能是或不希望的。