我有两个版本的my_begin
:为什么void *作为模板参数而不是模板参数?
template<typename T, typename std::enable_if<std::is_array<T>::value>::type* = 0>
typename std::decay<T>::type my_begin(T& array) {
return array;
}
和
template<typename T>
typename std::decay<T>::type my_begin(T& array,
typename std::enable_if<std::is_array<T>::value>::type* = 0) {
return array;
}
但第一个不能正常工作,并给出错误:
int a[10];
int* a_it = my_begin(a);
错误:
main.cpp:17:30: note: template argument deduction/substitution failed:
main.cpp:16:80: error: could not convert template argument '0' to 'std::enable_if<true, void>::type* {aka void*}'
template<typename T, typename std::enable_if<std::is_array<T>::value>::type* = 0>
但第二个工程。当我将第一个零中的0改为nullptr时,它也可以工作(但仍然不能用于NULL)。我不明白,在模板它需要显式类型转换(在这种情况下,从int
到void*
,但为什么第二个不需要吗?
另一个问题是,如果我删除*
和=
之间的空白,它也失败了?这是为什么
感谢您的详细解答! – texasbruce 2014-10-10 04:13:35