scn::scan_tuple compilation error with custom type
hmartin-hst opened this issue · 1 comments
hmartin-hst commented
Hi,
I'm trying to use the "return api" with custom types, but I get some compilation errors :
#include <scn/scn.h>
#include <scn/tuple_return.h>
struct point {
int x{}, y{};
};
template <>
struct scn::scanner<point> : scn::empty_parser {
template <typename Context>
error scan(point& val, Context& ctx)
{
return scn::scan_usertype(ctx, "({},{})", val.x, val.y);
}
};
int main(int argc, char *argv[]){
auto [r0, pt0] = scn::scan_tuple_default<point>("(1,2)"); // Compile
auto [r1, pt1] = scn::scan_tuple<point>("(1,2)", "{}"); // Won't compile
return 0;
}
[1/2] Building CXX object CMakeFiles/scan_tuple.dir/main.cpp.o
FAILED: CMakeFiles/scan_tuple.dir/main.cpp.o
/usr/bin/g++ -DSCN_HEADER_ONLY=0 -g -std=gnu++20 -MD -MT CMakeFiles/scan_tuple.dir/main.cpp.o -MF CMakeFiles/scan_tuple.dir/main.cpp.o.d -o CMakeFiles/scan_tuple.dir/main.cpp.o -c /home/hmartin/DEV/tests/scan_tuple/main.cpp
In file included from /usr/local/include/scn/scan/vscan.h:23,
from /usr/local/include/scn/scan/scan.h:23,
from /usr/local/include/scn/scn.h:21,
from /home/hmartin/DEV/tests/scan_tuple/main.cpp:2:
/usr/local/include/scn/detail/parse_context.h: In instantiation of ‘constexpr bool scn::v1::basic_parse_context<CharT>::check_arg_end() const [with CharT = scn::v1::basic_locale_ref<char>]’:
/usr/local/include/scn/reader/common.h:1183:36: required from ‘scn::v1::error scn::v1::empty_parser::parse(ParseCtx&) [with ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >]’
/usr/local/include/scn/detail/parse_context.h:325:27: required from ‘scn::v1::error scn::v1::basic_parse_context<CharT>::parse(Scanner&) [with Scanner = scn::v1::scanner<point>; CharT = scn::v1::basic_locale_ref<char>]’
/usr/local/include/scn/reader/common.h:1632:34: required from ‘scn::v1::error scn::v1::detail::visitor_boilerplate(T&, Context&, ParseCtx&) [with Scanner = scn::v1::scanner<point>; T = point; Context = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >]’
/usr/local/include/scn/detail/args.h:119:51: required from ‘scn::v1::error scn::v1::detail::scan_custom_arg(void*, Context&, ParseCtx&) [with Context = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; T = point]’
/usr/local/include/scn/detail/args.h:147:36: required from ‘scn::v1::detail::value::value(scn::v1::detail::ctx_tag<Ctx>, scn::v1::detail::parse_ctx_tag<ParseCtx>, T&) [with Ctx = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; T = point]’
/usr/local/include/scn/detail/args.h:204:72: required from ‘constexpr scn::v1::detail::value scn::v1::detail::init<CharT, T, scn::v1::detail::custom_type>::get() [with Ctx = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; CharT = char; T = point]’
/usr/local/include/scn/detail/args.h:442:49: required from ‘typename std::enable_if<Packed, scn::v1::detail::value>::type scn::v1::detail::make_arg(T&) [with bool Packed = true; Context = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; T = point; CharT = char; typename std::enable_if<Packed, scn::v1::detail::value>::type = scn::v1::detail::value]’
/usr/local/include/scn/detail/args.h:478:65: required from ‘constexpr scn::v1::arg_store<CharT, Args>::arg_store(scn::v1::detail::ctx_tag<Ctx>, scn::v1::detail::parse_ctx_tag<ParseCtx>, Args& ...) [with Ctx = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; CharT = char; Args = {point}]’
/usr/local/include/scn/detail/args.h:496:24: required from ‘scn::v1::arg_store<typename Context::char_type, Args ...> scn::v1::make_args(Args& ...) [with Context = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; Args = {point}; typename Context::char_type = char]’
/usr/local/include/scn/tuple_return/tuple_return.h:69:68: required from ‘std::tuple<decltype (scn::v1::detail::{anonymous}::wrap_result(static_cast<scn::v1::wrapped_error (*)()>(nullptr)(), static_cast<scn::v1::detail::range_tag<InputRange> (*)()>(nullptr)(), static_cast<typename scn::v1::range_wrapper_for<Range>::type (*)()>(nullptr)())), Args ...> scn::v1::scan_tuple(Range&&, Format) [with Args = {point}; Range = const char (&)[6]; Format = const char*; decltype (scn::v1::detail::{anonymous}::wrap_result(static_cast<scn::v1::wrapped_error (*)()>(nullptr)(), static_cast<scn::v1::detail::range_tag<InputRange> (*)()>(nullptr)(), static_cast<typename scn::v1::range_wrapper_for<Range>::type (*)()>(nullptr)())) = scn::v1::detail::reconstructed_scan_result<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> >, scn::v1::wrapped_error>; typename scn::v1::range_wrapper_for<Range>::type = scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> >]’
/home/hmartin/DEV/tests/scan_tuple/main.cpp:22:44: required from here
/usr/local/include/scn/detail/parse_context.h:303:32: error: no match for ‘operator==’ (operand types are ‘scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >::char_type’ {aka ‘scn::v1::basic_locale_ref<char>’} and ‘scn::v1::basic_locale_ref<char>’)
303 | return next_char() == detail::ascii_widen<char_type>('}');
| ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/scn/unicode/utf16.h:28,
from /usr/local/include/scn/unicode/unicode.h:26,
from /usr/local/include/scn/detail/locale.h:21,
from /usr/local/include/scn/scan/common.h:21,
from /usr/local/include/scn/scan/scan.h:22,
from /usr/local/include/scn/scn.h:21,
from /home/hmartin/DEV/tests/scan_tuple/main.cpp:2:
/usr/local/include/scn/unicode/common.h:39:20: note: candidate: ‘template<class T> constexpr bool scn::v1::operator==(scn::v1::code_point, T)’ (reversed)
39 | constexpr bool operator==(code_point a, T b)
| ^~~~~~~~
/usr/local/include/scn/unicode/common.h:39:20: note: template argument deduction/substitution failed:
In file included from /usr/local/include/scn/scan/vscan.h:23,
from /usr/local/include/scn/scan/scan.h:23,
from /usr/local/include/scn/scn.h:21,
from /home/hmartin/DEV/tests/scan_tuple/main.cpp:2:
/usr/local/include/scn/detail/parse_context.h:303:32: note: cannot convert ‘scn::v1::detail::ascii_widen(char) [with CharT = scn::v1::basic_locale_ref<char>]()’ (type ‘scn::v1::basic_locale_ref<char>’) to type ‘scn::v1::code_point’
303 | return next_char() == detail::ascii_widen<char_type>('}');
| ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/scn/unicode/utf16.h:26,
from /usr/local/include/scn/unicode/unicode.h:26,
from /usr/local/include/scn/detail/locale.h:21,
from /usr/local/include/scn/scan/common.h:21,
from /usr/local/include/scn/scan/scan.h:22,
from /usr/local/include/scn/scn.h:21,
from /home/hmartin/DEV/tests/scan_tuple/main.cpp:2:
/usr/local/include/scn/detail/error.h:115:27: note: candidate: ‘constexpr bool scn::v1::operator==(scn::v1::error, scn::v1::error)’
115 | constexpr inline bool operator==(error a, error b) noexcept
| ^~~~~~~~
/usr/local/include/scn/detail/error.h:115:44: note: no known conversion for argument 1 from ‘scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >::char_type’ {aka ‘scn::v1::basic_locale_ref<char>’} to ‘scn::v1::error’
115 | constexpr inline bool operator==(error a, error b) noexcept
| ~~~~~~^
In file included from /usr/local/include/scn/scan/vscan.h:23,
from /usr/local/include/scn/scan/scan.h:23,
from /usr/local/include/scn/scn.h:21,
from /home/hmartin/DEV/tests/scan_tuple/main.cpp:2:
/usr/local/include/scn/detail/parse_context.h: In instantiation of ‘constexpr scn::v1::basic_parse_context<CharT>::char_type scn::v1::basic_parse_context<CharT>::next_char() const [with CharT = scn::v1::basic_locale_ref<char>; scn::v1::basic_parse_context<CharT>::char_type = scn::v1::basic_locale_ref<char>]’:
/usr/local/include/scn/detail/parse_context.h:303:20: required from ‘constexpr bool scn::v1::basic_parse_context<CharT>::check_arg_end() const [with CharT = scn::v1::basic_locale_ref<char>]’
/usr/local/include/scn/reader/common.h:1183:36: required from ‘scn::v1::error scn::v1::empty_parser::parse(ParseCtx&) [with ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >]’
/usr/local/include/scn/detail/parse_context.h:325:27: required from ‘scn::v1::error scn::v1::basic_parse_context<CharT>::parse(Scanner&) [with Scanner = scn::v1::scanner<point>; CharT = scn::v1::basic_locale_ref<char>]’
/usr/local/include/scn/reader/common.h:1632:34: required from ‘scn::v1::error scn::v1::detail::visitor_boilerplate(T&, Context&, ParseCtx&) [with Scanner = scn::v1::scanner<point>; T = point; Context = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >]’
/usr/local/include/scn/detail/args.h:119:51: [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/local/include/scn/detail/args.h:204:72: required from ‘constexpr scn::v1::detail::value scn::v1::detail::init<CharT, T, scn::v1::detail::custom_type>::get() [with Ctx = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; CharT = char; T = point]’
/usr/local/include/scn/detail/args.h:442:49: required from ‘typename std::enable_if<Packed, scn::v1::detail::value>::type scn::v1::detail::make_arg(T&) [with bool Packed = true; Context = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; T = point; CharT = char; typename std::enable_if<Packed, scn::v1::detail::value>::type = scn::v1::detail::value]’
/usr/local/include/scn/detail/args.h:478:65: required from ‘constexpr scn::v1::arg_store<CharT, Args>::arg_store(scn::v1::detail::ctx_tag<Ctx>, scn::v1::detail::parse_ctx_tag<ParseCtx>, Args& ...) [with Ctx = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; CharT = char; Args = {point}]’
/usr/local/include/scn/detail/args.h:496:24: required from ‘scn::v1::arg_store<typename Context::char_type, Args ...> scn::v1::make_args(Args& ...) [with Context = scn::v1::basic_context<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> > >; ParseCtx = scn::v1::basic_parse_context<scn::v1::basic_locale_ref<char> >; Args = {point}; typename Context::char_type = char]’
/usr/local/include/scn/tuple_return/tuple_return.h:69:68: required from ‘std::tuple<decltype (scn::v1::detail::{anonymous}::wrap_result(static_cast<scn::v1::wrapped_error (*)()>(nullptr)(), static_cast<scn::v1::detail::range_tag<InputRange> (*)()>(nullptr)(), static_cast<typename scn::v1::range_wrapper_for<Range>::type (*)()>(nullptr)())), Args ...> scn::v1::scan_tuple(Range&&, Format) [with Args = {point}; Range = const char (&)[6]; Format = const char*; decltype (scn::v1::detail::{anonymous}::wrap_result(static_cast<scn::v1::wrapped_error (*)()>(nullptr)(), static_cast<scn::v1::detail::range_tag<InputRange> (*)()>(nullptr)(), static_cast<typename scn::v1::range_wrapper_for<Range>::type (*)()>(nullptr)())) = scn::v1::detail::reconstructed_scan_result<scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> >, scn::v1::wrapped_error>; typename scn::v1::range_wrapper_for<Range>::type = scn::v1::detail::range_wrapper<scn::v1::basic_string_view<char> >]’
/home/hmartin/DEV/tests/scan_tuple/main.cpp:22:44: required from here
/usr/local/include/scn/detail/parse_context.h:164:32: error: use of deleted function ‘scn::v1::basic_locale_ref<char>::basic_locale_ref(const scn::v1::basic_locale_ref<char>&)’
164 | return m_str.front();
| ^
In file included from /usr/local/include/scn/scan/common.h:21,
from /usr/local/include/scn/scan/scan.h:22,
from /usr/local/include/scn/scn.h:21,
from /home/hmartin/DEV/tests/scan_tuple/main.cpp:2:
/usr/local/include/scn/detail/locale.h:463:11: note: ‘scn::v1::basic_locale_ref<char>::basic_locale_ref(const scn::v1::basic_locale_ref<char>&)’ is implicitly deleted because the default definition would be ill-formed:
463 | class basic_locale_ref {
| ^~~~~~~~~~~~~~~~
/usr/local/include/scn/detail/locale.h:463:11: error: use of deleted function ‘scn::v1::detail::unique_ptr<T>::unique_ptr(const scn::v1::detail::unique_ptr<T>&) [with T = scn::v1::detail::basic_custom_locale_ref<char>]’
In file included from /usr/local/include/scn/detail/locale.h:24,
from /usr/local/include/scn/scan/common.h:21,
from /usr/local/include/scn/scan/scan.h:22,
from /usr/local/include/scn/scn.h:21,
from /home/hmartin/DEV/tests/scan_tuple/main.cpp:2:
/usr/local/include/scn/util/unique_ptr.h:54:13: note: declared here
54 | unique_ptr(const unique_ptr&) = delete;
| ^~~~~~~~~~
ninja: build stopped: subcommand failed.
eliaskosunen commented
Fixed, thanks for reporting!