你可以理解为
如果模板A可以成功演绎模板B,模板B却不能演绎模板A
那么B就比A要特殊一点,编译器会就选B
其实不需要那个返回值的约束,看下面这个代码
#include<string>
#include<stdio.h>
using namespace std;
template<typename T, typename V>
V func(T first, T last, V result)
{
printf("in func1\n");
}
template<typename TT, typename VV>
VV* func(TT* first, TT* last, VV* result)
{
printf("in func2\n");
}
int main()
{
int arr[] = {1,2,4,56,6,7};
int res[10];
func(arr, arr+3, res);
return 0;
}
输出也是func2
因为func1可以通过让T=TT*, V=VV*来演绎func2
而反过来是不行的,func2的形参必须是指针,它更特殊一些
所以编译器选择了func2
【 在 wangkk2012 (wangkk2012) 的大作中提到: 】
: “特殊”是指什么意思啊,mystl::copy(arr1, arr1 + 5, act); 这个函数已经指定了int类型,不过 调用1和调用2 两个都是模板,从哪方面考虑 调用2更接近 int类型啊
--
FROM 171.83.6.*