簡體   English   中英

我如何解決Visual Studio 2012不支持顯式轉換運算符?

[英]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
}

基本上,我希望能夠在添加或分配intfoo沒有明確的轉換foo實例。

我的第一次代碼嘗試不會編譯,因為(如果我理解這一點)當我沒有在轉換運算符上explicit指定時, bar + 3算作運算符重載 - bar和3都可以是fooint ,所以VS不知道是對它們運行(算術,算術)還是( foofoo )。

在我的第二次代碼嘗試(上圖)中,我向轉換運算符添加了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM