首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个共同的范围?

如何创建一个共同的范围?
EN

Stack Overflow用户
提问于 2022-09-17 12:07:50
回答 1查看 86关注 0票数 0

为什么std::ranges::common_view不在下面的代码中编译?

代码语言:javascript
复制
#include <ranges>
#include <vector>
#include <algorithm>

template <class T>
struct IteratorSentinel {};

template <class T>
class Iterator
{
public:

    using iterator_category = std::input_iterator_tag;

    using value_type = T;

    using difference_type = std::ptrdiff_t;

    using pointer = value_type*;

    using reference = value_type&;

    Iterator() = default;

    Iterator(const Iterator&) = delete;

    Iterator& operator = (const Iterator&) = delete;

    Iterator(Iterator&& other) = default;

    Iterator& operator = (Iterator&& other) = default;

    T* operator-> () { return cur(); }

    T& operator* () { return *cur(); }

    T& operator* () const { return *cur(); };

    bool operator== (const IteratorSentinel<T>&) const noexcept;

    Iterator& operator++ ();

    void operator++ (int);

private:

    T* cur() const
    {
        return pCur;
    }

    T* pCur = nullptr;
};

static_assert(std::input_iterator<Iterator<int>>); 

template <class T>
auto make_range()
{
    return std::ranges::subrange(Iterator<T>(), IteratorSentinel<T>{});
}

int main()
{
    auto r = make_range<int>();

    auto cr = std::ranges::common_view{ r };

    std::vector<int> v;

    std::copy(cr.begin(), cr.end(), std::back_inserter(v));

    return 0;
}

无法确定它需要什么模板参数。

MSVC2022错误(/std:c++latest):

代码语言:javascript
复制
error C2641: cannot deduce template arguments for 'std::ranges::common_view'
error C2893: Failed to specialize function template 'std::ranges::common_view<_Vw> std::ranges::common_view(_Vw) noexcept(<expr>)'

GCC12错误:

代码语言:javascript
复制
prog.cc: In function 'int main()':
prog.cc:67:43: error: class template argument deduction failed:
   67 |     auto cr = std::ranges::common_view{ r };
      |                                           ^
prog.cc:67:43: error: no matching function for call to 'common_view(std::ranges::subrange<Iterator<int>, IteratorSentinel<int>, std::ranges::subrange_kind::unsized>&)'
In file included from prog.cc:1:
/opt/wandbox/gcc-12.1.0/include/c++/12.1.0/ranges:3724:7: note: candidate: 'template<class _Vp> common_view(_Vp)-> std::ranges::common_view<_Vp>'
 3724 |       common_view(_Vp __r)
      |       ^~~~~~~~~~~
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-17 13:33:53

您的范围是由迭代器/哨兵对构建的。公共范围的定义是前哨类型是迭代器的范围。所以范围本身并不是一个共同的范围。

common_view can generate a common range from a non-common range。这意味着它必须创建两个迭代器。由于它只使用一个迭代器启动流程,这意味着,在某个时候,它必须复制该迭代器(从而创建两个可用的迭代器)。

因为你的迭代器是不可复制的。这就是为什么common_view明确要求迭代器是可复制的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73754698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档