C++ 为什么编译器需要一个中间交换函数来推断类型? 模板 无效掉期(T&t1、T&t2) { T tmp=t1; t1=t2; t2=tmp; } 模板 无效反向(双开始,双结束) { while(开始!=结束){ --结束; 如果(开始!=结束){ ::交换(*开始++,*结束); } } }

C++ 为什么编译器需要一个中间交换函数来推断类型? 模板 无效掉期(T&t1、T&t2) { T tmp=t1; t1=t2; t2=tmp; } 模板 无效反向(双开始,双结束) { while(开始!=结束){ --结束; 如果(开始!=结束){ ::交换(*开始++,*结束); } } },c++,templates,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) {

为什么上述方法有效

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);
        }
    }
}
模板
无效反转2(双开始,双结束)
{
while(开始!=结束){
--结束;
如果(开始!=结束){
T tmp=*开始;
*开始+=*结束;
*end=tmp;
}
}
}
而这不是吗


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

编译器从函数签名而不是函数正文推断参数类型


由于函数签名中根本没有使用
T
void reverse2(双开始,双结束)
),编译器无法推断类型。但是,在
swap
的情况下,它可以推断类型,因为它是在函数签名中推导出来的。

使用C++11,您可能会在
auto tmp=*begin
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;
        }
    }
}