有人可以向我解释为什么在下面的代码中,如果我尝试实例化MyFooC,我会对Foo中的重载构造函数进行模糊调用?我的假设是用作构造函数参数的整数将被提升为unsigned int并已被解析,但这显然是不正确的。
template <typename t> class Foo
{
private:
t m_Value;
unsigned int m_Length;
public:
Foo(const t& Value) :
m_Value(Value),
m_Length(0)
{
}
Foo(unsigned int Length) :
m_Value(static_cast<t>(0)),
m_Length(Length)
{
}
};
int main()
{
Foo<double> MyFooA(32U);
Foo<double> MyFooB(32.0f);
//Foo<double> MyFooC(32);
return 0;
}
答案 0 :(得分:10)
int
可以转换为double
和unsigned
;两者都是
考虑“扩大”转换,并具有相同的排名。作为一般
规则,任何时候你重载,其中一个重载是一个积分
类型,最好在int
上重载,以确保
得到你想要的东西,并避免含糊不清,当有人试图
通过一个整数常数。
int
转换为unsigned int
。
答案 1 :(得分:0)
我认为问题在于int可以很容易地转换为double。我知道C ++中没有规范隐式转换的优先顺序,因此当编译器看到一个可以转为double或unsigned int的int时,它会将调用视为不明确的。