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
),但我只想实现一个版本的运算符==
,与classNumber
一样。我看不出有什么办法。这是可能的,还是我必须在类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;
}