2017-04-10 59 views
-3

我有一个名为uniVal的类,定义了转换为int_64的double和string。当我尝试比较这个类的对象为int GCC说: 候选人是:C++运算符==和用户定义类型转换

operator==(int, int) <built-in> 
operator==(int64_t {aka long int}, int) <built-in> 
operator==(unsigned int, int) <built-in> 
operator==(long unsigned int, int) <built-in> 
operator==(float, int) <built-in> 
operator==(double, int) <built-in> 
error: ambiguous overload for ‘operator==’ (operand types are ‘uniVal’ and ‘int’) 

但如果我指定投加倍要明确它编译。是否有可能让gcc选择最接近其他参数类型的转换类型?

UPD: 编写自己的操作符==对于每种类型的组合来说,offcourse会解决这个问题,但是我希望这个类能用于所有的C++类型,所以我想只写一堆转换函数,编译器完成剩下的工作。

+0

如果你写了你自己的'operator ==(uniVal,int)'和'operator ==(int,uniVal)',那应该可以解决问题 – Justin

回答

0

是否有可能让gcc选择最接近其他参数类型的转换类型?

短版本:不,因为在重载分辨率中,不考虑每个参数类型的关系。

龙版本:

编译器发现所有可行的功能(即,可以theoretiaclly可以通过转换或者直接给定的参数调用所有功能),并排列他们反目成仇。当且仅当只有其中一个可行功能严格优于所有其他功能时,超载解析才能成功。关于如何比较功能的精确列表可以参考here(“最佳可行功能”部分)。对于这种特殊的情况下,只有以下是相关的:

F1被确定为比F2更好的功能,如果F1的所有参数隐式转换并不比F2的所有参数的隐式转换差,[ ...]至少有一个F1的参数,其隐式转换优于F2的该参数的相应隐式转换[012]

其余规则不适用于您的上下文,因为返回每个操作符的类型都是相同的,它们不是模板(或其专业化)。 此外,您的第二个操作数不需要任何转换(在您的问题中存在重载的子集),因此全部是关于uniVallongdouble以及以下数字促销/转换的转换。

转换序列每个都根据下列排序(见here;节“的隐式转换的序列的排序”):

  1. 完全匹配:不需要转换,左值到右值转换,资格转换,类类型的用户定义转换到同一类

  2. 推广:积分推广,浮点促进

  3. 转换:积分转换,浮点转换,浮积分变换,指针转换,指针到构件转换,布尔转换,用户定义的转换派生类的它的基

对于您的情况,除用户定义的转换外,long intdouble都不需要额外的转换。因此,他们的排名相同(但优于需要额外转换的其他候选人)。因此,你的电话含糊不清。

您会注意到,没有意义比较不同参数的类型。这是(不是)完成的一个很好的理由:毕竟,函数体中的参数可能不会彼此结合使用(实际上,它们将在operator==中,但对于编译器来说,这只是一个函数像所有其他人一样),在这种情况下,比较他们的类型不会提供任何有用的信息。

+0

我意识到这个问题的范围有所不同。我错过了一些关于所提问题的细节,直到我完成大部分工作,所以我想我会刚刚完成我的工作。 – Pandatyr

+0

嗯,我发现这个信息非常有用,所以谢谢 – Gammamad

相关问题