我有兩個版本的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