为什么std :: iterator_traits找不到value_type?

时间:2017-04-11 10:01:57

标签: c++ templates iterator

为什么我不能编译下一个代码?

#include <iterator>

struct test_iterator {
    using value_type = int;
};

int main()
{
    std::iterator_traits<test_iterator>::value_type a  = 0;
    return a;
}

似乎所有三个主要编译器(msvc / gcc / clang)都无法编译此代码。

据我所知,std::iterator_traits的作用类似于:

template <class T>
struct iterator_traits {
    using value_type = typename T::value_type;
    ... // other memebers
};

这里有什么问题?

1 个答案:

答案 0 :(得分:4)

来自iterator_traits,因为C ++ 17:

  

&#34;如果Iterator没有五个成员类型difference_type,value_type,pointer,reference和iterator_category,则此模板没有任何这些名称的成员(std::iterator_traits对SFINAE友好)& #34;

提供缺少的类型可修复错误:Demo