2017-04-10 77 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

相關問題