不了解范围::v3的这个问题



我有以下代码片段使用范围::v3:

#include <range/v3/view/all.hpp>
#include <range/v3/view/filter.hpp>
#include <range/v3/view/join.hpp>
#include <range/v3/range/conversion.hpp>
#include <unordered_map>
#include <limits>
#include <stdint.h>
#include <sys/socket.h>
#include <string>
struct EncodedValueDecoder: std::unordered_map<int, uint8_t> {
using Base_t = std::unordered_map<int, uint8_t>;
EncodedValueDecoder(int mask, const Base_t& values) :
Base_t(values), mask_(mask == 0 ? std::numeric_limits<int>::max() : mask) {
}
std::string findAll(const int target) const {
return *this | ranges::views::filter([&target, this](const typename Base_t::value_type& item) {
return bitSet(item.first, target);
}) | ranges::views::join(",") | ranges::to<std::string>();
}
int maskedValue(const int target) const {
return static_cast<int>(target & mask_);
}
bool bitSet(const int bit, const int target) const {
return bit & target & mask_;
}
int mask_;
};

我得到以下错误
g++ -std=c++23 -O0 -g3 -pedantic -pedantic-errors -Wall -Wextra -Werror -Wconversion -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wlogical-op -Wmissing-declarations -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wshadow -Wsign-conversion -Wsign-promo -Wswitch-default -Wfloat-equal -c -pthread -Winvalid-pch -fmessage-length=0 -Wdouble-promotion -Wimplicit-fallthrough=5 -Wuninitialized -Winit-self -Wsuggest-override -Wduplicated-branches -Wduplicated-cond -Wtrampolines -Wcast-qual -Wuseless-cast -Wsized-deallocation -ftemplate-backtrace-limit=0 -fPIC -o src/main.o ../src/main.cpp 
../src/main.cpp: In member function ‘std::string EncodedValueDecoder::findAll(int) const’:
../src/main.cpp:20:20: error: no match for ‘operator|’ (operand types are ‘ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >’ and ‘ranges::views::view_closure<ranges::detail::bind_back_fn_<ranges::views::join_base_fn, ranges::detail::reference_wrapper_<const char [2]> > >’)
18 |                 return *this | ranges::views::filter([&target, this](const typename Base_t::value_type& item) {
|                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|                              |
|                              ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >
19 |                         return bitSet(item.first, target);
|                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 |                 }) | ranges::views::join(",") | ranges::to<std::string>();
|                 ~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~
|                                         |
|                                         ranges::views::view_closure<ranges::detail::bind_back_fn_<ranges::views::join_base_fn, ranges::detail::reference_wrapper_<const char [2]> > >
In file included from /usr/include/range/v3/view/all.hpp:28,
from ../src/main.cpp:1:
/usr/include/range/v3/view/view.hpp:142:35: note: candidate: ‘template<class ViewFn, class Pipeable> constexpr concepts::return_t<ranges::views::view_closure<ranges::composed<Pipeable, ViewFn> >, typename std::enable_if<(is_pipeable_v<Pipeable> && concepts::detail::CPP_true_fn(concepts::detail::Nil{})), void>::type> ranges::views::view_closure_base_ns::operator|(ranges::views::view_closure<Fun>, Pipeable)’
142 |             friend constexpr auto operator|(view_closure<ViewFn> vw, Pipeable pipe)
|                                   ^~~~~~~~
/usr/include/range/v3/view/view.hpp:142:35: note:   template argument deduction/substitution failed:
../src/main.cpp:20:45: note:   ‘ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >’ is not derived from ‘ranges::views::view_closure<Fun>’
20 |                 }) | ranges::views::join(",") | ranges::to<std::string>();
|                                             ^
/usr/include/range/v3/view/view.hpp:127:13: note: candidate: ‘template<class Rng, class ViewFn> constexpr concepts::return_t<Rng, typename std::enable_if<((range<Rng> && (! viewable_range<Rng>)) && concepts::detail::CPP_true_fn(concepts::detail::Nil{})), void>::type> ranges::views::view_closure_base_ns::operator|(Rng&&, const ranges::views::view_closure<ViewFn>&)’ (deleted)
127 |             operator|(Rng &&, view_closure<ViewFn> const &) // ******* READ THIS ********
|             ^~~~~~~~
/usr/include/range/v3/view/view.hpp:127:13: note:   template argument deduction/substitution failed:
/usr/include/range/v3/view/view.hpp: In substitution of ‘template<class Rng, class ViewFn> constexpr concepts::return_t<Rng, typename std::enable_if<((range<Rng> && (! viewable_range<Rng>)) && concepts::detail::CPP_true_fn(concepts::detail::Nil{})), void>::type> ranges::views::view_closure_base_ns::operator|(Rng&&, const ranges::views::view_closure<ViewFn>&) [with Rng = ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >; ViewFn = ranges::detail::bind_back_fn_<ranges::views::join_base_fn, ranges::detail::reference_wrapper_<const char [2]> >]’:
../src/main.cpp:20:31:   required from here
/usr/include/range/v3/view/view.hpp:127:13: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
/usr/include/range/v3/view/view.hpp:117:35: note: candidate: ‘template<class Rng, class ViewFn>  requires (viewable_range<Rng>) && (invocable_view_closure<ViewFn, Rng>) constexpr auto ranges::views::view_closure_base_ns::operator|(Rng&&, ranges::views::view_closure<ViewFn>)’
117 |             friend constexpr auto operator|(Rng && rng, view_closure<ViewFn> vw)
|                                   ^~~~~~~~
/usr/include/range/v3/view/view.hpp:117:35: note:   template argument deduction/substitution failed:
/usr/include/range/v3/view/view.hpp:117:35: note: constraints not satisfied
In file included from /usr/include/range/v3/range_fwd.hpp:22,
from /usr/include/range/v3/view/all.hpp:20:
/usr/include/range/v3/functional/concepts.hpp: In substitution of ‘template<class Rng, class ViewFn>  requires (viewable_range<Rng>) && (invocable_view_closure<ViewFn, Rng>) constexpr auto ranges::views::view_closure_base_ns::operator|(Rng&&, ranges::views::view_closure<ViewFn>) [with Rng = ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >; ViewFn = ranges::detail::bind_back_fn_<ranges::views::join_base_fn, ranges::detail::reference_wrapper_<const char [2]> >]’:
../src/main.cpp:20:31:   required from here
/usr/include/range/v3/functional/concepts.hpp:40:5:   required for the satisfaction of ‘invocable_requires_<Fun, Args ...>’ [with Fun = ranges::detail::bind_back_fn_<ranges::views::join_base_fn, ranges::detail::reference_wrapper_<const char[2]> >; Args = {ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll::._anon_127>}]
/usr/include/range/v3/functional/concepts.hpp:48:17:   required for the satisfaction of ‘invocable<ViewFn, Rng>’ [with ViewFn = ranges::detail::bind_back_fn_<ranges::views::join_base_fn, ranges::detail::reference_wrapper_<const char[2]> >; Rng = ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll::._anon_127>]
/usr/include/range/v3/view/view.hpp:83:17:   required for the satisfaction of ‘invocable_view_closure<ViewFn, Rng>’ [with ViewFn = ranges::detail::bind_back_fn_<ranges::views::join_base_fn, ranges::detail::reference_wrapper_<const char[2]> >; Rng = ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll::._anon_127>]
/usr/include/range/v3/functional/concepts.hpp:40:5:   in requirements with ‘Fun&& fn’ [with Args = {ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll::._anon_127>}; Fun = ranges::detail::bind_back_fn_<ranges::views::join_base_fn, ranges::detail::reference_wrapper_<const char[2]> >]
/usr/include/range/v3/functional/concepts.hpp:40:5: note: the required expression ‘ranges::invoke((Fun&&)(fn), (declval<Args>)()...)’ is invalid
40 |     CPP_requires(invocable_,
|     ^~~~~~~~~~~~
cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail
In file included from /usr/include/meta/meta.hpp:18,
from /usr/include/range/v3/view/all.hpp:18:
/usr/include/c++/12.1.0/cstddef:132:3: note: candidate: ‘constexpr std::byte std::operator|(byte, byte)’
132 |   operator|(byte __l, byte __r) noexcept
|   ^~~~~~~~
/usr/include/c++/12.1.0/cstddef:132:18: note:   no known conversion for argument 1 from ‘ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >’ to ‘std::byte’
132 |   operator|(byte __l, byte __r) noexcept
|             ~~~~~^~~
In file included from /usr/include/c++/12.1.0/streambuf:41,
from /usr/include/c++/12.1.0/bits/streambuf_iterator.h:35,
from /usr/include/c++/12.1.0/iterator:66,
from /usr/include/range/v3/range/access.hpp:21,
from /usr/include/range/v3/view/all.hpp:22:
/usr/include/c++/12.1.0/bits/ios_base.h:87:3: note: candidate: ‘constexpr std::_Ios_Fmtflags std::operator|(_Ios_Fmtflags, _Ios_Fmtflags)’
87 |   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
|   ^~~~~~~~
/usr/include/c++/12.1.0/bits/ios_base.h:87:27: note:   no known conversion for argument 1 from ‘ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >’ to ‘std::_Ios_Fmtflags’
87 |   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
|             ~~~~~~~~~~~~~~^~~
/usr/include/c++/12.1.0/bits/ios_base.h:130:3: note: candidate: ‘constexpr std::_Ios_Openmode std::operator|(_Ios_Openmode, _Ios_Openmode)’
130 |   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
|   ^~~~~~~~
/usr/include/c++/12.1.0/bits/ios_base.h:130:27: note:   no known conversion for argument 1 from ‘ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >’ to ‘std::_Ios_Openmode’
130 |   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
|             ~~~~~~~~~~~~~~^~~
/usr/include/c++/12.1.0/bits/ios_base.h:170:3: note: candidate: ‘constexpr std::_Ios_Iostate std::operator|(_Ios_Iostate, _Ios_Iostate)’
170 |   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
|   ^~~~~~~~
/usr/include/c++/12.1.0/bits/ios_base.h:170:26: note:   no known conversion for argument 1 from ‘ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >’ to ‘std::_Ios_Iostate’
170 |   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
|             ~~~~~~~~~~~~~^~~
In file included from /usr/include/c++/12.1.0/bits/shared_ptr_atomic.h:33,
from /usr/include/c++/12.1.0/memory:78,
from /usr/include/range/v3/utility/addressof.hpp:15,
from /usr/include/range/v3/iterator/basic_iterator.hpp:29,
from /usr/include/range/v3/iterator/reverse_iterator.hpp:20,
from /usr/include/range/v3/range/access.hpp:37:
/usr/include/c++/12.1.0/bits/atomic_base.h:98:3: note: candidate: ‘constexpr std::memory_order std::operator|(memory_order, __memory_order_modifier)’
98 |   operator|(memory_order __m, __memory_order_modifier __mod)
|   ^~~~~~~~
/usr/include/c++/12.1.0/bits/atomic_base.h:98:26: note:   no known conversion for argument 1 from ‘ranges::filter_view<ranges::ref_view<const EncodedValueDecoder>, EncodedValueDecoder::findAll(int) const::<lambda(const std::unordered_map<int, unsigned char>::value_type&)> >’ to ‘std::memory_order’
98 |   operator|(memory_order __m, __memory_order_modifier __mod)
|             ~~~~~~~~~~~~~^~~
../src/main.cpp: In member function ‘int EncodedValueDecoder::maskedValue(int) const’:
../src/main.cpp:23:24: error: useless cast to type ‘int’ [-Werror=useless-cast]
23 |                 return static_cast<int>(target & mask_);
|                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

它似乎在抱怨operator|没有合适的过载。考虑到这段代码是我从博客中看到的一些处理ranges::v3的示例中改编的,我显然误解了一些东西。有人能指出我的错误吗?

我发布的代码是无意义的,这就是为什么它不会编译。向JaMiT致敬。如果我能找到奖励一颗金星的方法,我会的。

最新更新