重载构造函数之间的歧义

时间:2011-09-15 12:36:22

标签: c++ templates

有人可以向我解释为什么在下面的代码中,如果我尝试实例化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;
}

2 个答案:

答案 0 :(得分:10)

int可以转换为doubleunsigned;两者都是 考虑“扩大”转换,并具有相同的排名。作为一般 规则,任何时候你重载,其中一个重载是一个积分 类型,最好在int上重载,以确保 得到你想要的东西,并避免含糊不清,当有人试图 通过一个整数常数。

顺便说一句:虽然在上下文中你的意思很明确,但在C ++标准中, “促销”具有非常精确的含义,并不包括 将int转换为unsigned int

答案 1 :(得分:0)

我认为问题在于int可以很容易地转换为double。我知道C ++中没有规范隐式转换的优先顺序,因此当编译器看到一个可以转为double或unsigned int的int时,它会将调用视为不明确的。