【问题标题】:no type named ‘value_type’ in ‘struct std::iterator_traits“struct std::iterator_traits”中没有名为“value_type”的类型
【发布时间】:2020-05-08 03:07:37
【问题描述】:

我正在尝试实现一个简单的 ostream_itreator,它会流式传输每个第 N 个元素,但我得到一个类型错误

error: no type named ‘value_type’ in ‘struct std::iterator_traits<outIterator<int> >’
       typedef typename iterator_traits<_OI>::value_type _ValueTypeO;

代码:

#include <iostream>
#include <vector>
#include <iterator>


template<class T>
class outIterator {
    std::ostream *stream;
    size_t N;
    const char* delim;
    size_t counter = 0;
public:
    // initialization
    outIterator(std::ostream& out)
    : stream(&out)
    , N(1)
    , delim(" ")
    {}

    outIterator(std::ostream& out, size_t N, const char* delimiter)
    : stream(&out)
    , N(N)
    , delim(delimiter)
    {}

    // =
    outIterator<T>& operator= (const T& value) {
        if (counter % N == 0){
            *stream << value << delim;
        }
        return *this;
    }
};

int main() {
    outIterator<int> out(std::cout, 2, " ");
    std::vector<int> vec {0, 1, 2, 3, 4, 5};
    std::copy(vec.begin(), vec.end(), out);
    return 0;
}

我也没有包括重载 ++ 和 ++(int)。他们增加计数器并返回 *this。 和 * 重载返回 *this

错误描述:

/usr/include/c++/7/bits/stl_algobase.h:378:57: error: no type named ‘value_type’ in ‘struct std::iterator_traits<outIterator<int> >’
       typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
                                                         ^~~~~~~~~~~
/usr/include/c++/7/bits/stl_algobase.h:383:9: error: no type named ‘value_type’ in ‘struct std::iterator_traits<outIterator<int> >’
       const bool __simple = (__is_trivial(_ValueTypeI)
                             ~~~~~~~~~~~~~~~~~~~~~~~~~~
                       && __is_pointer<_II>::__value
                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                       && __is_pointer<_OI>::__value
                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         && __are_same<_ValueTypeI, _ValueTypeO>::__value);
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

【问题讨论】:

  • 请不要发布代码/输出的图像。请在此处复制并粘贴文本。
  • 1.我有一个错误:很多代码,添加一些细节。 2. 为什么?
  • 图片链接可能会被破坏,所以问题的目的是作为其他人将来可以看到的参考。另外,有时想要帮助解决问题的人想从错误中查找某些内容,或者用谷歌搜索。如果错误是文本形式,它会使这更容易。顺便说一句,感谢您的编辑。
  • @DmitryKuznetsov 因为它迫使我们加载外部资源只是为了能够阅读您的问题。如果链接断开或外部站点同时出现故障怎么办? SO无法控制它。如果我在该输出中找到要在此处或答案中发表评论的内容怎么办?我无法复制和粘贴它,我必须手动输入它,考虑到我们试图免费帮助您,这很粗鲁,为什么我们必须做额外的工作来帮助您?
  • 所以你是对的,冷静

标签: c++ c++11 iterator


【解决方案1】:

在编写迭代器时,必须包含一些变量。您只需要包括这些:

template <class T>
class iterator {
    public:
        // code ...   
        using iterator_category = std::forward_iterator_tag;
        using difference_type = std::ptrdiff_t;
        using value_type = T;
        using pointer = value_type*;
        using reference = value_type&;
        // code ...
 }

【讨论】:

    【解决方案2】:

    自定义迭代器类型必须包含 difference_typevalue_typepointerreferenceiterator_category 的成员 typedef,或者专门化 std::iterator_traits 以提供相同的内容。

    在您的具体情况下,您应该像这样修改您的 outIterator 模板:

    template <typename T>
    class outIterator {
    //...
    public:
        using difference_type = std::ptrdiff_t;
        using value_type = T;
        using pointer = T*;
        using reference = T&;
        using iterator_category = std::output_iterator_tag;
    //...
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2017-09-06
      • 1970-01-01
      • 2023-03-20
      • 2021-05-28
      • 1970-01-01
      • 2019-05-05
      相关资源
      最近更新 更多