使用std::enable_if检测随机访问迭代器出现type-name声明冲突怎么解决
问题原因
std::enable_if使用不完整:typename关键字后必须跟合法类型,你没有追加::type获取enable_if定义的返回类型,直接写typename std::enable_if<条件>不符合语法要求,就会触发编译器报类型声明相关错误。- 迭代器标签判断逻辑错误:你直接将迭代器类型和
std::random_access_iterator_tag做相等判断,实际应该从std::iterator_traits萃取器中取出迭代器的类别标签再做比较。
修复方案
C++11 版本写法
#include <type_traits> #include <iterator> template<class RandomAccessIterator, class Compare> typename std::enable_if< std::is_same< typename std::iterator_traits<RandomAccessIterator>::iterator_category, std::random_access_iterator_tag >::value >::type quick_sort(RandomAccessIterator first, RandomAccessIterator last, Compare compare) { sorting(first, last, 0, last - first - 1, compare); }
C++14及以上版本简化写法
可以用std::enable_if_t省略外层typename和末尾的::type,代码更简洁:
#include <type_traits> #include <iterator> template<class RandomAccessIterator, class Compare> std::enable_if_t< std::is_same_v< typename std::iterator_traits<RandomAccessIterator>::iterator_category, std::random_access_iterator_tag > > quick_sort(RandomAccessIterator first, RandomAccessIterator last, Compare compare) { sorting(first, last, 0, last - first - 1, compare); }
内容的提问来源于stack exchange,提问作者Spectra 2001
相关产品推荐
相关产品推荐

