[英]How can I work around Visual Studio 2012 not supporting explicit conversion operators?
這是我正在嘗試做的一個人為的,袖手旁觀的例子:
#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
算作運算符重載 - bar
和3都可以是foo
或int
,所以VS不知道是對它們運行(算術,算術)還是( foo
, foo
)。
在我的第二次代碼嘗試(上圖)中,我向轉換運算符添加了explicit
,因此在該情況下bar
必須是foo
,這意味着沒有重載。
問題是Visual Studio 2012不支持顯式轉換運算符 。 當我嘗試使用它時,它給了我“錯誤C2071:非法存儲類”。
所以這是我的問題:是否有可能得到我想要的行為? 再次 - 我希望能夠通過foo::operator+
或foo::operator=
添加或賦予foo
一個int
,而無需在foo
實例上使用顯式轉換。
將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 <<'來打印......
你可以嘗試:
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; }
};
所以,沒有轉換(有完全匹配)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.