为什么我需要一个中间交换函数来使编译器能够推导出类型?

时间:2012-07-01 12:11:37

标签: c++ templates

template <class T>
void swap(T &t1, T &t2)
{
    T tmp = t1;
    t1 = t2;
    t2 = tmp;
}

template <class Bi>
void reverse(Bi begin, Bi end)
{
    while (begin != end) {
        --end;

        if (begin != end) {
            ::swap(*begin++, *end);
        }
    }
}

为什么上述工作?

template <class Bi, class T>
void reverse2(Bi begin, Bi end)
{
    while (begin != end) {
        --end;

        if (begin != end) {
            T tmp = *begin;
            *begin++ = *end;
            *end = tmp;
        }
    }
}

虽然这不是吗?

对于第一个工作示例,编译器必须能够在编译时推导出交换函数的参数类型。 (即它必须能够确定*begin++*end的类型。)如果可能,为什么编译器不能推断*begin返回的值的类型第二个例子并相应地选择T

1 个答案:

答案 0 :(得分:4)

编译器从函数签名中推断出参数类型,而不是函数 body

由于T未在函数签名中使用(void reverse2(Bi begin, Bi end)),因此编译器无法推断出类型。但是,在swap的情况下,它可以推断出类型,因为它是在函数签名中推导出来的。