gpt4 book ai didi

c++ - 使用强制转换运算符和单参数构造函数为类重载运算符

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:52:24 26 4
gpt4 key购买 nike

我有这样的代码

class Number
{
int m_value;

public :
Number(const int value) :
m_value(value)
{
}

operator const int() const
{
return m_value;
}

int GetValue() const
{
return m_value;
}
};

bool operator==(const Number& left, const Number& right)
{
return left.GetValue() == right.GetValue();
}

class Integer
{
int m_value;

public :
Integer(const int value) :
m_value(value)
{
}

operator const int() const
{
return m_value;
}

bool operator==(const Integer& right) const
{
return m_value == right.m_value;
}

bool operator==(const int right) const
{
return m_value == right;
}

int GetValue() const
{
return m_value;
}
};

bool operator==(const int left, const Integer& right)
{
return left == right.GetValue();
}

int main()
{
Number n1 = 1;
Number n2 = 1;
int x3 = 1;

n1 == n2;
n1 == x3; // error C2666: 'operator ==' : 3 overloads have similar conversions
x3 == n1; // error C2666: 'operator ==' : 2 overloads have similar conversions

Integer i4 = 1;
Integer i5 = 1;

i4 == i5;
i4 == x3;
x3 == i4;

return 0;
}

对于 Number 类,我有两个错误,如上面的代码所示。对于 Integer 类,一切正常。问题是,我想在结果类中保留单参数构造函数、强制转换运算符和相等操作 (MyClass == int, int == MyClass, MyClass == MyClass),但我只想实现 operator== 的一个版本,如类 Number 中。我看不出有什么办法可以做到这一点。这甚至是可能的,还是我必须像 Integer 类中那样拥有所有三个实现?我知道为什么会出现这些错误,我只是不喜欢现有的解决方案。

最佳答案

Number 类中,您定义了一个到 int 的转换运算符,并且您的构造函数允许将 int 转换为 Number。因此,当比较一个 Number n 和一个 int x 是否相等时,会产生歧义:编译器是否应该调用内置的 operator == int 并将 n 转换为 int,或者它应该选择您的运算符并将 x 转换为 编号?两种转化都一样好,它不能二选一。

所以是的,你必须定义三个版本,或者添加一个模板运算符,它可以完美匹配所有参数的类型并显式转发给你的运算符,就像这个(但你很可能想用一些 来保护它enable_if 将其适用性限制为仅适用于适当的 TU):

template<typename T, typename U> // beware: this will match anything. to be constrained
bool operator == (T n, U const& u)
{
return (Number(n) == Number(u));
}

关于c++ - 使用强制转换运算符和单参数构造函数为类重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386067/

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