因爲重載具有兩個同樣可行函數(既具有用戶定義的轉換)選擇您得到一個錯誤。函數重載解析是一個非常複雜的主題。有關過載分辨率的更多詳細信息,請參閱Stephan T. Lavavej的recent lecture。通常最好使用單參數構造函數explicit
,然後使用顯式構造函數參數調用您的函數。
test(0L)
與任何過載都不完全匹配,因爲沒有過載test(long)
。您提供的兩個重載都在其參數上有用戶定義的轉換,但編譯器認爲它們同樣可行。 A
過載必須執行標準轉換(long轉換爲int),後跟用戶定義的轉換(int轉換爲A),並且B
將用戶定義的轉換(long轉換爲B)進行重載。但都是隱式用戶定義的轉換序列。
這些排名如何?標準說在13.3.3.2排名的隱式轉換的序列[over.ics.rank]
Standard conversion sequence S1 is a better conversion sequence than standard conversion sequence S2 if S1 is a proper subsequence of S2
這些類型的例如平局決勝如果A是B的派生類(反之亦然),則適用。但是在這裏,兩個轉換序列都不是另一個的後續序列。因此它們同樣可行並且編譯器無法解決呼叫。
class A
{
public:
explicit A(int){}
A(){}
};
class B: public A
{
public:
explicit B(long){}
B(){}
};
void test(A a)
{}
void test(B b)
{}
int main()
{
test(A(0L)); // call first overload
test(B(0L)); // call second overload
return 0;
}
注:這是int main()
,不void main()
。
+1,這是最正式的正確答案,但你可以擴大解釋了一下。 – Xeo 2012-08-09 09:51:30
@rhalbersma:但我認爲測試(0L)更準確地匹配測試(B b)?爲什麼不明確? – 2012-08-09 09:54:53
'0L'是'long',所以你的第二段應該說「沒有'test(long)'」。 – Xeo 2012-08-09 10:01:20