为什么std :: iterator_traits无法找到value_type?

xyl*_*per 4 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;
}
Run Code Online (Sandbox Code Playgroud)

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

据我所知,std::iterator_traits工作方式如下:

template <class T>
struct iterator_traits {
    using value_type = typename T::value_type;
    ... // other memebers
};
Run Code Online (Sandbox Code Playgroud)

怎么了

Jar*_*d42 6

iterator_traits开始,从C ++ 17开始:

“如果Iterator没有五个成员类型difference_type,value_type,指针,引用和iterator_category,则此模板不包含任何这些名称的成员(对std::iterator_traitsSFINAE友好)”

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