【问题标题】:Why can't std::iterator_traits find value_type?为什么 std::iterator_traits 找不到 value_type?
【发布时间】:2017-09-06 15:41:39
【问题描述】:

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

#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
};

这里有什么问题?

【问题讨论】:

  • From iterator_traits since C++17: "如果Iterator没有五种成员类型differ_type、value_type、pointer、reference和iterator_category,那么这个模板没有任何成员这些名称中的一个(std::iterator_traits 对 SFINAE 友好)"

标签: c++ templates iterator


【解决方案1】:

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

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

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

如果迭代器满足某些概念,C++20 会添加新的方法来填充成员。

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多