我正在仿写TinySTL,发现原作者的UninitializedFunctions.h有问题。就是下面这行:
typedef typename _type_traits<iterator_traits<InputIterator>::value_type>::is_POD_type isPODType;
报错是:
UninitializedFunctions.h: In function ‘ForwardIterator WhoseTinySTL::uninitialized_copy(InputIterator, InputIterator, ForwardIterator)’:
UninitializedFunctions.h:33:81: error: type/value mismatch at argument 1 in template parameter list for ‘template<class T> struct WhoseTinySTL::_type_traits’
33 | typedef typename _type_traits<iterator_traits<InputIterator>::value_type>::is_POD_type isPODType;
| ^
到处查找不到,只能自己硬着头皮看。从报错标记的位置来看,它说_type_traits<>
里的参数类型不对,这哪不对啊?iterator_traits<InputIterator>::value_type
不就是类型名么?后来我想到了,这其实是使用模板的一个非常常见的问题:iterator_traits<InputIterator>::value_type
这样的东西通常被编译器认为是变量名,而不是类型名。所以你要显式地用typename告诉编译器它是个类型名:
typedef typename _type_traits<typename iterator_traits<InputIterator>::value_type>::is_POD_type isPODType;
讲这件事的文章非常多,这篇比较好,我就不赘述了。
PS:本文为我原创,你说GitHub上有人提了这个issue了?那就是我,欢迎follow!