这是我正在尝试做的一个人为的,袖手旁观的例子:
#include <iostream>
using namespace std;
class foo
{
int num;
public:
foo() : num(0) {}
foo(int i) : num(i) {}
explicit operator int() const { return num; }
foo operator+(const foo& rhs) const { return foo(num + rhs.num); }
foo& operator=(const foo& rhs) : num(rhs.num) { return *this; };
friend ostream& operator<<(ostream& o) { o << num; return o; }
};
void main()
{
foo bar = 4; // Works fine
cout << bar + 3; // Error C2071. Will be Error C2666 if 'explicit' is removed
// cout << (int) bar + 3; // If I get rid of 'explicit' above, the above
// line must be switched with this to compile
}
基本上,我希望能够在不int
实例的显式转换的情况下向foo
添加或分配foo
。
我的第一次代码尝试无法编译,因为(如果我理解这一点)当我没有在转换运算符上指定explicit
时,bar + 3
被视为运算符重载 - { {1}}和3可能都是bar
或foo
,因此VS不知道是运行(算术,算术)还是(int
,foo
)它们。
在我的第二次代码尝试(上图)中,我向转化运算符添加了foo
,因此explicit
在这种情况下必须是bar
,这意味着没有超载。< / p>
问题在于Visual Studio 2012 doesn't support explicit conversion operators。当我尝试使用它时,它给了我“错误C2071:非法存储类”。
所以这是我的问题:是否有可能得到我想要的行为?再次 - 我希望能够foo
添加int
到foo
到foo::operator+
或foo::operator=
,而无需在foo
的实例上使用显式转换
答案 0 :(得分:1)
将operator+=
定义为成员函数,将operator+
定义为友元函数:
class foo
{
foo& operator+=(const foo& obj);
friend foo operator+(const foo& obj1,const foo& obj2);
};
foo& f::operator+=(const foo& obj)
{
return *this=*this+obj;
}
friend foo operator+(const foo& obj1,const foo& obj2)
{
return foo(obj1.num+obj2.num)
}
顺便说一下,你还需要实现'operator&lt;&lt;'用于印刷...
答案 1 :(得分:1)
您可以尝试:
class foo
{
int num;
public:
foo() : num(0) {}
/*explicit*/ foo(int i) { num = i; }
/*explicit*/ operator int() const { return num; }
foo& operator=(const foo& rhs) { num = rhs.num; return *this; };
friend foo operator+(const foo& lhs, const foo& rhs) { return foo(lhs.num + rhs.num); }
friend foo operator+(int lhs, const foo& rhs) { return foo(lhs + rhs.num); }
friend foo operator+(const foo& lhs, int rhs) { return foo(lhs.num + rhs); }
friend std::ostream& operator<<(std::ostream& o, const foo& rhs) { o << rhs.num; return o; }
};
所以,没有转换(完全匹配)。