matt-42 / silicon

A high performance, middleware oriented C++14 http web framework please use matt-42/lithium instead
http://siliconframework.org
MIT License
1.73k stars 138 forks source link

Compiling error when using post_parameters #47

Closed stkrwork closed 7 years ago

stkrwork commented 7 years ago

Hey,

when compiling this: `

include <silicon/api.hh>

include <silicon/backends/mhd.hh>

include "symbols.h"

using namespace sl; // Silicon namespace using namespace s; // Symbols namespace

int main() { // Define the API: auto hello_api = http_api(

    // The hello world procedure.
    GET / _hello = [] () { return D(_message = "Hello world."); },

    POST / _login * post_parameters(_uname, _pwd) = [] (auto param) {
        if (param.uname == "Albert" && param.pwd == "test") {
            return D(_status = "success");
        } else {
            return D(_status = "failure");
        }
    }
);
// Serve hello_api via microhttpd using the json format:
sl::mhd_json_serve(hello_api, 12345);
return 0;

} `

I get a compilation error. ` 13:02:52 Build of configuration Debug for project SiliconTest make pre-build main-build iod_generate_symbols ../main.cpp ../symbols.h

Building file: ../main.cpp Invoking: Cross G++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.o" -o "main.o" "../main.cpp" In file included from ../main.cpp:10:0: /usr/include/silicon/backends/mhd.hh: In instantiation of ‘sl::mhd_json_service_utils::decode_post_parameters_urlencoded(O&, sl::mhd_request) const::<lambda(auto:91)> [with auto:91 = s::_uname_t::variable_type<std::cxx11::basic_string >; P = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >; O = iod::sio<s::_uname_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >]’: /usr/include/iod/foreach.hh:133:29: required from ‘decltype(auto) iod::internal::sio_foreach(std::enable_if_t<(typename std::remove_reference<_To>::type:: _size != 0)>, F, T1&&, T&& ...) [with F = sl::mhd_json_service_utils::decode_post_parameters_urlencoded(O&, sl::mhd_request) const [with P = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >; O = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >]::<lambda(auto:91)>; T1 = const iod::sio<s::_uname_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >&; T = {}; std::enable_if_t<(typename std::remove_reference<_To>::type:: _size != 0)> = void]’ /usr/include/iod/foreach.hh:168:42: required from ‘decltype(auto) iod::internal::foreach_sio_caller::run(F, std::index_sequence<I ...>) [with F = sl::mhd_json_service_utils::decode_post_parameters_urlencoded(O&, sl::mhd_request) const [with P = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >; O = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >]::<lambda(auto:91)>; long unsigned int ...I = {0ul}; T = std::tuple<const iod::sio<s::_uname_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >&>; std::index_sequence<I ...> = std::integer_sequence<long unsigned int, 0ul>]’ /usr/include/iod/foreach.hh:174:76: required from ‘decltype(auto) iod::internal::foreach_sio_caller::operator|(F) [with F = sl::mhd_json_service_utils::decode_post_parameters_urlencoded(O&, sl::mhd_request) const [with P = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >; O = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >]::<lambda(auto:91)>; T = std::tuple<const iod::sio<s::_uname_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >&>]’ /usr/include/silicon/backends/mhd.hh:212:20: required from ‘void sl::mhd_json_service_utils::decode_post_parameters_urlencoded(O&, sl::mhd_request) const [with P = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >; O = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >]’ /usr/include/silicon/backends/mhd.hh:254:54: required from ‘auto sl::mhd_json_service_utils::deserialize(sl::mhd_json_service_utils::request_type*, P, T&) const [with P = sl::procedure<sl::http_route<sl::http_post, std::tuple, iod::sio<>, iod::sio<>, iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > > >, iod::sio<s::_uname_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >, iod::sio<s::_status_t::variable_type<const char, iod::sio<> > >, sl::bind_procedure2(F, std::tuple<_Elements ...>) [with F = main()::<lambda(auto:92)>; U = {iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >}]::<lambda(iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >)> >; T = iod::sio<s::_uname_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >; sl::mhd_json_service_utils::request_type = sl::mhd_request]’ /usr/include/silicon/service.hh:66:34: required from ‘void sl::ws_handler<P, M, S, ARGS>::operator()(M&, S&, ARGS& ...) [with P = sl::procedure<sl::http_route<sl::http_post, std::tuple, iod::sio<>, iod::sio<>, iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > > >, iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >, iod::sio<s::_status_t::variable_type<const char, iod::sio<> > >, sl::bind_procedure2(F, std::tuple<_Elements ...>) [with F = main()::<lambda(auto:92)>; U = {iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >}]::<lambda(iod::sio<s::_uname_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >)> >; M = std::tuple; S = sl::mhd_json_service_utils; ARGS = {sl::mhd_request, sl::mhd_response, MHD_Connection}]’ ../main.cpp:35:1: required from here /usr/include/silicon/backends/mhd.hh:219:13: error: cannot call member function ‘void sl::mhd_json_service_utils::decode_post_parameter_urlencoded(T, U&, const string&) const [with T = std::cxx11::basic_string; U = std::__cxx11::basic_string; std::cxx11::string = std::cxx11::basic_string]’ without object decode_post_parameter_urlencoded((std::decay_t<decltype(m.value())>*) 0, ^~~~~~~~ /usr/include/silicon/backends/mhd.hh:230:30: error: use of ‘auto s::_uname_t::variable_type<T, INFO>::attributes() const [with T = std::cxx11::basic_string; INFO = iod::sio<>]’ before deduction of ‘auto’ if(!m.attributes().has(_optional))

In file included from /usr/include/iod/grammar.hh:6:0, from /usr/include/iod/sio.hh:9, from /usr/include/silicon/api.hh:4, from ../main.cpp:9: /usr/include/iod/foreach.hh:53:5: error: ‘void iod::internal::sio_foreach_impl(std::enable_if_t<std::is_same<void, Ret>::value>, std::index_sequence<TSize ...>, F, T&& ...) [with Ret = void; F = sl::mhd_json_service_utils::decode_post_parameters_urlencoded(O&, sl::mhd_request) const [with P = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >; O = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >]::<lambda(auto:91)>; long unsigned int ...TSize = {0ul, 1ul}; long unsigned int ...Nargs = {}; T = {const iod::sio<s::_uname_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >&}; std::enable_if_t<std::is_same<void, Ret>::value> = void; std::index_sequence<TSize ...> = std::integer_sequence<long unsigned int, 0ul, 1ul>]’, declared using local type ‘sl::mhd_json_service_utils::decode_post_parameters_urlencoded(O&, sl::mhd_request) const [with P = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >; O = iod::sio<s::_uname_t::variable_type<std::cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> >, s::_pwd_t::variable_type<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, iod::sio<> > >]::<lambda(auto:91)>’, is used but never defined [-fpermissive] sio_foreach_impl(std::enable_if_t<std::is_same<void, Ret>::value>, ^~~~ subdir.mk:18: recipe for target 'main.o' failed make: *** [main.o] Error 1

13:02:56 Build Finished (took 3s.805ms) `

When changing the post request to a get request, everything works fine. GET / _login * get_parameters(_uname, _pwd) = [] (auto param) {...}

matt-42 commented 7 years ago

Thanks for the report. It was a problem specific to g++. This is fixed with 32b5fb9320a8759a861dfdaab6b098e5949cdb90 . Note that clang++ is better at compiling silicon : lower compilation times, and better error message. There is also the ORM that does not compile yet with g++.