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;
}
}
}