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

C++ 使用强制转换运算符和单参数构造函数重载类的运算符,c++,operator-overloading,typecast-operator,C++,Operator Overloading,Typecast Operator,我有这样的密码 类号 { int m_值; 公众: 数字(常数int值): m_值(值) { } 运算符常量int()常量 { 返回m_值; } int GetValue()常量 { 返回m_值; } }; 布尔运算符==(常数编号和左、常数编号和右) { 返回left.GetValue()==right.GetValue(); } 类整数 { int m_值; 公众: 整数(常量int值): m_值(值) { } 运算符常量int()常量 { 返回m_值; } 布尔运算符==(常量整数和右)常

我有这样的密码

类号
{
int m_值;
公众:
数字(常数int值):
m_值(值)
{
}
运算符常量int()常量
{
返回m_值;
}
int GetValue()常量
{
返回m_值;
}
};
布尔运算符==(常数编号和左、常数编号和右)
{
返回left.GetValue()==right.GetValue();
}
类整数
{
int m_值;
公众:
整数(常量int值):
m_值(值)
{
}
运算符常量int()常量
{
返回m_值;
}
布尔运算符==(常量整数和右)常量
{
返回m_值==right.m_值;
}
布尔运算符==(常量int right)常量
{
返回m_值==右;
}
int GetValue()常量
{
返回m_值;
}
};
布尔运算符==(常量整型左、常量整型右)
{
返回left==right.GetValue();
}
int main()
{
编号n1=1;
n2=1;
int x3=1;
n1==n2;
n1==x3;//错误C2666:“运算符==”:3个重载具有类似的转换
x3==n1;//错误C2666:“运算符==”:2个重载具有类似的转换
整数i4=1;
整数i5=1;
i4==i5;
i4==x3;
x3==i4;
返回0;
}

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

在类
Number
中,您定义了一个转换运算符,将
int
转换为
Number
。因此,当比较
数字n
int x
是否相等时,就会产生歧义:编译器是否应该调用
int
的内置
运算符==
并将
n
转换为
int
,还是应该选择您的运算符并将
x
转换为
数字
?两种转换都一样好,它不能选择一种

因此,是的,您必须定义三个版本,或者添加一个模板运算符,该运算符可以完全匹配所有参数的类型,并显式地转发给您的运算符,如下图所示(但您很可能希望使用一些
enable\U if
来保护它,以将其适用性限制在适当的
T
U
):

template//注意:这将匹配任何内容。约束
布尔运算符==(tn,U常量和U)
{
返回(编号(n)=编号(u));
}

您只能将一个
运算符==
定义为成员函数:

bool operator==(const int& right) const
{
    std::cout << "custom\n";
    return this->GetValue() == right;
}
bool运算符==(常量int&right)常量
{
std::cout GetValue()==右;
}
那么

  • n1==n2
    n2
    将转换为
    int
    ,并使用自定义运算符
  • n1==n3
    :将使用自定义运算符
  • n3==n1
    :将使用内置运算符

注意,您希望您的
运算符==
const
能够比较常量
Number
s

在C++11中,您可以使
运算符int
显式


另一种方法是使用SFINAE制作一个模板,该模板适用于一个或多个
Number
args,但使用火箭筒杀死蚂蚁。

请将名称
n3
更改为
x
,以避免混淆,同样地,
n4
n5
i1
i2
。尝试
数字
定义显式的
构造函数一个愚蠢的解决方案:如果你去掉
bool操作符==(左常量数字,右常量数字)
,那么你需要三种比较(
Number==int
int==Number
Number==Number
)将被隐式转换为int并进行编译。这就是您应该小心提供隐式转换的主要原因。我以前从未使用过enable\if,因此我将尝试解决它。感谢您提供的解决方案!
bool operator==(const int& right) const
{
    std::cout << "custom\n";
    return this->GetValue() == right;
}