Код: Выделить всё
const std::vector words =
// Getting a range of words (tokens) from cin
std::views::istream(std::cin)
| views::transform(tolower) // Converting all words to lower-case
| views::transform(isalnum) // Removing non alphanumeric characters from the words
| views::filter([] (const std::string &s) {
return !s.empty();
})
| std::ranges::sort;
Код: Выделить всё
main.cpp: In function ‘int main(int, char**)’:
main.cpp:38:9: error: no match for ‘operator|’ (operand types are ‘std::ranges::basic_istream_view’ and ‘std::ranges::views::__adaptor::_Partial’)
37 | std::views::istream(std::cin)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| std::ranges::basic_istream_view
38 | | views::transform(tolower) // Converting all words to lower-case
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| std::ranges::views::__adaptor::_Partial
In file included from main.cpp:7:
/usr/include/c++/13/ranges:896:7: note: candidate: ‘template requires (derived_from) && (derived_from) constexpr auto std::ranges::views::__adaptor::operator|(_Lhs, _Rhs)’
896 | operator|(_Lhs __lhs, _Rhs __rhs)
| ^~~~~~~~
/usr/include/c++/13/ranges:896:7: note: template argument deduction/substitution failed:
/usr/include/c++/13/ranges:896:7: note: constraints not satisfied
In file included from /usr/include/c++/13/compare:37,
from /usr/include/c++/13/bits/char_traits.h:56,
from /usr/include/c++/13/ios:42,
from /usr/include/c++/13/ostream:40,
from /usr/include/c++/13/iostream:41,
from main.cpp:1:
/usr/include/c++/13/concepts: In substitution of ‘template requires (derived_from) && (derived_from) constexpr auto std::ranges::views::__adaptor::operator|(_Lhs, _Rhs) [with _Lhs = std::ranges::basic_istream_view; _Rhs = std::ranges::views::__adaptor::_Partial]’:
main.cpp:38:35: required from here
/usr/include/c++/13/concepts:67:13: required for the satisfaction of ‘derived_from’ [with _Lhs = std::ranges::basic_istream_view]
/usr/include/c++/13/concepts:67:28: note: ‘std::ranges::views::__adaptor::_RangeAdaptorClosure’ is not a base of ‘std::ranges::basic_istream_view’
67 | concept derived_from = __is_base_of(_Base, _Derived)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/13/ranges:887:7: note: candidate: ‘template requires (derived_from) && (__adaptor_invocable) constexpr auto std::ranges::views::__adaptor::operator|(_Range&&, _Self&&)’
887 | operator|(_Range&& __r, _Self&& __self)
| ^~~~~~~~
/usr/include/c++/13/ranges:887:7: note: template argument deduction/substitution failed:
/usr/include/c++/13/ranges:887:7: note: constraints not satisfied
/usr/include/c++/13/ranges: In substitution of ‘template requires (derived_from) && (__adaptor_invocable) constexpr auto std::ranges::views::__adaptor::operator|(_Range&&, _Self&&) [with _Self = std::ranges::views::__adaptor::_Partial; _Range = std::ranges::basic_istream_view]’:
main.cpp:38:35: required from here
/usr/include/c++/13/ranges:859:13: required for the satisfaction of ‘__adaptor_invocable’ [with _Self = std::ranges::views::__adaptor::_Partial; _Range = std::ranges::basic_istream_view]
/usr/include/c++/13/ranges:860:9: in requirements [with _Adaptor = std::ranges::views::__adaptor::_Partial; _Args = {std::ranges::basic_istream_view}]
/usr/include/c++/13/ranges:860:44: note: the required expression ‘declval()((declval)()...)’ is invalid
860 | = requires { std::declval()(declval()...); };
| ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail
In file included from /usr/include/c++/13/bits/memory_resource.h:38,
from /usr/include/c++/13/string:58,
from /usr/include/c++/13/bits/locale_classes.h:40,
from /usr/include/c++/13/bits/ios_base.h:41,
from /usr/include/c++/13/ios:44:
/usr/include/c++/13/cstddef:135:3: note: candidate: ‘constexpr std::byte std::operator|(byte, byte)’
135 | operator|(byte __l, byte __r) noexcept
| ^~~~~~~~
/usr/include/c++/13/cstddef:135:18: note: no known conversion for argument 1 from ‘std::ranges::basic_istream_view’ to ‘std::byte’
135 | operator|(byte __l, byte __r) noexcept
| ~~~~~^~~
/usr/include/c++/13/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++/13/bits/ios_base.h:87:27: note: no known conversion for argument 1 from ‘std::ranges::basic_istream_view’ to ‘std::_Ios_Fmtflags’
87 | operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
| ~~~~~~~~~~~~~~^~~
/usr/include/c++/13/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++/13/bits/ios_base.h:130:27: note: no known conversion for argument 1 from ‘std::ranges::basic_istream_view’ to ‘std::_Ios_Openmode’
130 | operator|(_Ios_Openmode __a, _Ios_Openmode __b)
| ~~~~~~~~~~~~~~^~~
/usr/include/c++/13/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++/13/bits/ios_base.h:170:26: note: no known conversion for argument 1 from ‘std::ranges::basic_istream_view’ to ‘std::_Ios_Iostate’
170 | operator|(_Ios_Iostate __a, _Ios_Iostate __b)
| ~~~~~~~~~~~~~^~~
< /code>
В типичной моде C ++ это очень точное и совершенно неразборчивое (для меня). Я попытался создать начальный диапазон различных способов, но, по -видимому, все они решаются до одного и того же базового std :: ranges :: basic_istream_view Очевидно, этот подход работал в исходной библиотеке диапазонов/V3 (с iStream_range (std :: cin) ), но не работает в текущей библиотеке STD.
Есть ли способ заставить это работать?
Подробнее здесь: https://stackoverflow.com/questions/794 ... omposition