我如何解决Visual Studio 2012不支持显式转换运算符?

时间:2014-01-14 09:12:59

标签: c++ visual-studio-2012 c++11 type-conversion

这是我正在尝试做的一个人为的,袖手旁观的例子:

#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可能都是barfoo,因此VS不知道是运行(算术,算术)还是(intfoo)它们。

在我的第二次代码尝试(上图)中,我向转化运算符添加了foo,因此explicit在这种情况下必须是bar,这意味着没有超载。< / p>

问题在于Visual Studio 2012 doesn't support explicit conversion operators。当我尝试使用它时,它给了我“错误C2071:非法存储类”。

所以这是我的问题:是否有可能得到我想要的行为?再次 - 我希望能够foo添加intfoofoo::operator+foo::operator=,而无需在foo的实例上使用显式转换

2 个答案:

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

所以,没有转换(完全匹配)。