因为重载具有两个同样可行函数(既具有用户定义的转换)选择您得到一个错误。函数重载解析是一个非常复杂的主题。有关过载分辨率的更多详细信息,请参阅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