gpt4 book ai didi

c++ - 我如何解决 Visual Studio 2012 不支持显式转换运算符的问题?

转载 作者:行者123 更新时间:2023-11-28 02:59:45 25 4
gpt4 key购买 nike

这是我正在尝试做的一个人为的、即兴的例子:

#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 都可能是 fooint,所以 VS 不知道是否要运行(算术, arithmetic) 或 (foo, foo) 在他们身上。

在我的第二次代码尝试(上面)中,我将 explicit 添加到转换运算符,因此 bar 必须是 foo这种情况,意味着没有过载。

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

所以这是我的问题:是否有可能获得我想要的行为?再次 - 我希望能够通过 foo::operator+foo::operator 添加或分配 intfoo =,不对 foo 的实例使用显式转换。

最佳答案

你可以试试:

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

因此,没有转换(存在完全匹配)。

关于c++ - 我如何解决 Visual Studio 2012 不支持显式转换运算符的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21109653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com