eliaskosunen/scnlib

scn::scan_tuple compilation error with custom type

hmartin-hst opened this issue · 1 comments

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.

Fixed, thanks for reporting!