boost-ext / di

C++14 Dependency Injection Library
https://boost-ext.github.io/di
1.16k stars 140 forks source link

Compilation error when using shared_factory with runtime_injector #399

Open ColinDuquesnoy opened 5 years ago

ColinDuquesnoy commented 5 years ago

Context

I am trying to use the runtime_injector (because our application with hundreds of bindings now takes several minutes to compile and compilation time looks exponential :worried: ). We're using named injection and shared_factory extension extensively in our application (because of #252).

Unfortunately it looks like using named injection or shared_factory does not work with the runtime_injector. This issue is about shared_factory.

Please let me know if this is a known limitation or if I am using it wrong.

Sample code

Expected Behavior

No compilation error.

Actual Behavior

Compilation error:

====================[ Build | main | Debug ]====================================
/opt/evs/jetbrains-clion/bin/cmake/linux/bin/cmake --build /home/cdu/CLionProjects/poc-boost-di-runtime-injector/cmake-build-debug --target main -- -j 4
Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
In file included from /home/cdu/CLionProjects/poc-boost-di-runtime-injector/main.cpp:2:0:
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp: In instantiation of ‘boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&)::<lambda()> [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]’:
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:124:84:   required from ‘struct boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]::<lambda()>’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:124:75:   required from ‘void boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/main.cpp:16:5:   required from here
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:125:37: error: call of overloaded ‘make(const boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>&)’ is ambiguous
       return make<typename T::given>(binding);
                                     ^
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:158:8: note: candidate: decltype (make_impl<T>(typename boost::di::v1_1_0::ctor_traits<T>::type{})) boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::make(const TBinding&) [with T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; TBinding = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config; decltype (make_impl<T>(typename boost::di::v1_1_0::ctor_traits<T>::type{})) = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >*]
   auto make(const TBinding &) -> decltype(make_impl<T>(typename ctor_traits<T>::type{})) {
        ^
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:163:8: note: candidate: decltype (new T) boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::make(const TBinding&) [with T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; TBinding = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config; decltype (new T) = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >*]
   auto make(const TBinding &binding) -> decltype(new T{binding.object_}) {
        ^
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp: In instantiation of ‘void boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]’:
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/main.cpp:16:5:   required from here
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:124:75: error: no match for ‘operator=’ (operand types are ‘std::unordered_map<std::type_index, std::function<void*()> >::mapped_type {aka std::function<void*()>}’ and ‘boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]::<lambda()>’)
     this->cfg().bindings()[std::type_index(typeid(typename T::expected))] = [this, binding] {
                                                                           ^
In file included from /opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/memory:79:0,
                 from /home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/include/boost/di.hpp:94,
                 from /home/cdu/CLionProjects/poc-boost-di-runtime-injector/main.cpp:1:
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2069:7: note: candidate: std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(const std::function<_Res(_ArgTypes ...)>&) [with _Res = void*; _ArgTypes = {}]
       operator=(const function& __x)
       ^
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2069:7: note:   no known conversion for argument 1 from ‘boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]::<lambda()>’ to ‘const std::function<void*()>&’
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2087:7: note: candidate: std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::function<_Res(_ArgTypes ...)>&&) [with _Res = void*; _ArgTypes = {}]
       operator=(function&& __x)
       ^
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2087:7: note:   no known conversion for argument 1 from ‘boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]::<lambda()>’ to ‘std::function<void*()>&&’
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2101:7: note: candidate: std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::nullptr_t) [with _Res = void*; _ArgTypes = {}; std::nullptr_t = std::nullptr_t]
       operator=(nullptr_t) noexcept
       ^
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2101:7: note:   no known conversion for argument 1 from ‘boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]::<lambda()>’ to ‘std::nullptr_t’
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2130:2: note: candidate: template<class _Functor> std::function<_Res(_ArgTypes ...)>::_Requires<std::function<_Res(_ArgTypes ...)>::_Callable<typename std::decay<_Tp>::type>, std::function<_Res(_ArgTypes ...)>&> std::function<_Res(_ArgTypes ...)>::operator=(_Functor&&) [with _Functor = _Functor; _Res = void*; _ArgTypes = {}]
  operator=(_Functor&& __f)
  ^
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2130:2: note:   template argument deduction/substitution failed:
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2139:2: note: candidate: template<class _Functor> std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::reference_wrapper<_Tp>) [with _Functor = _Functor; _Res = void*; _ArgTypes = {}]
  operator=(reference_wrapper<_Functor> __f) noexcept
  ^
/opt/rh/devtoolset-4/root/usr/include/c++/5.3.1/functional:2139:2: note:   template argument deduction/substitution failed:
In file included from /home/cdu/CLionProjects/poc-boost-di-runtime-injector/main.cpp:2:0:
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:124:75: note:   ‘boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]::<lambda()>’ is not derived from ‘std::reference_wrapper<_Tp>’
     this->cfg().bindings()[std::type_index(typeid(typename T::expected))] = [this, binding] {
                                                                           ^
In file included from /home/cdu/CLionProjects/poc-boost-di-runtime-injector/main.cpp:1:0:
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/include/boost/di.hpp: In instantiation of ‘boost::di::v1_1_0::core::wrapper_impl<T, TWrapper, <template-parameter-1-3> >::operator T() [with T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >&&; TWrapper = boost::di::v1_1_0::wrappers::unique<boost::di::v1_1_0::scopes::unique, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >*>; <template-parameter-1-3> = int]’:
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/include/boost/di.hpp:2167:99:   required from ‘boost::di::v1_1_0::core::any_type_ref<TParent, TInjector, TError, TRefError>::operator T&&() const [with T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; <template-parameter-2-2> = int; <template-parameter-2-3> = int; TParent = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; TInjector = boost::di::v1_1_0::core::injector<boost::di::v1_1_0::extension::runtime_provider<boost::di::v1_1_0::extension::assert_error_policy, boost::di::v1_1_0::extension::shared_config>, boost::di::v1_1_0::core::pool<> >; TError = boost::di::v1_1_0::aux::integral_constant<bool, false>; TRefError = boost::di::v1_1_0::aux::integral_constant<bool, true>]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:58:48:   required from ‘auto boost::di::v1_1_0::extension::runtime_provider<TErrorPolicy, TScopeTraits>::abstract_provider::get(std::true_type, TArgs&& ...) const [with T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; TArgs = {boost::di::v1_1_0::core::any_type_ref<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::core::injector<boost::di::v1_1_0::extension::runtime_provider<boost::di::v1_1_0::extension::assert_error_policy, boost::di::v1_1_0::extension::shared_config>, boost::di::v1_1_0::core::pool<boost::di::v1_1_0::aux::type_list<> > >, boost::di::v1_1_0::aux::integral_constant<bool, false>, boost::di::v1_1_0::aux::integral_constant<bool, true> >, boost::di::v1_1_0::core::any_type_ref<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::core::injector<boost::di::v1_1_0::extension::runtime_provider<boost::di::v1_1_0::extension::assert_error_policy, boost::di::v1_1_0::extension::shared_config>, boost::di::v1_1_0::core::pool<boost::di::v1_1_0::aux::type_list<> > >, boost::di::v1_1_0::aux::integral_constant<bool, false>, boost::di::v1_1_0::aux::integral_constant<bool, true> >}; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config; std::true_type = std::integral_constant<bool, true>]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:48:22:   required from ‘auto boost::di::v1_1_0::extension::runtime_provider<TErrorPolicy, TScopeTraits>::abstract_provider::get(const TInitialization&, const TMemory&, TArgs&& ...) const [with T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; TInitialization = boost::di::v1_1_0::type_traits::direct; TMemory = boost::di::v1_1_0::type_traits::stack; TArgs = {boost::di::v1_1_0::core::any_type_ref<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::core::injector<boost::di::v1_1_0::extension::runtime_provider<boost::di::v1_1_0::extension::assert_error_policy, boost::di::v1_1_0::extension::shared_config>, boost::di::v1_1_0::core::pool<boost::di::v1_1_0::aux::type_list<> > >, boost::di::v1_1_0::aux::integral_constant<bool, false>, boost::di::v1_1_0::aux::integral_constant<bool, true> >, boost::di::v1_1_0::core::any_type_ref<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::core::injector<boost::di::v1_1_0::extension::runtime_provider<boost::di::v1_1_0::extension::assert_error_policy, boost::di::v1_1_0::extension::shared_config>, boost::di::v1_1_0::core::pool<boost::di::v1_1_0::aux::type_list<> > >, boost::di::v1_1_0::aux::integral_constant<bool, false>, boost::di::v1_1_0::aux::integral_constant<bool, true> >}; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/include/boost/di.hpp:2409:110:   required from ‘auto boost::di::v1_1_0::core::provider<boost::di::v1_1_0::aux::pair<T, boost::di::v1_1_0::aux::pair<TInitialization, TList<TCtor ...> > >, TName, TInjector>::get_impl(const TMemory&, TArgs&& ...) const [with TMemory = boost::di::v1_1_0::type_traits::stack; TArgs = {boost::di::v1_1_0::core::any_type_ref<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::core::injector<boost::di::v1_1_0::extension::runtime_provider<boost::di::v1_1_0::extension::assert_error_policy, boost::di::v1_1_0::extension::shared_config>, boost::di::v1_1_0::core::pool<boost::di::v1_1_0::aux::type_list<> > >, boost::di::v1_1_0::aux::integral_constant<bool, false>, boost::di::v1_1_0::aux::integral_constant<bool, true> >, boost::di::v1_1_0::core::any_type_ref<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::core::injector<boost::di::v1_1_0::extension::runtime_provider<boost::di::v1_1_0::extension::assert_error_policy, boost::di::v1_1_0::extension::shared_config>, boost::di::v1_1_0::core::pool<boost::di::v1_1_0::aux::type_list<> > >, boost::di::v1_1_0::aux::integral_constant<bool, false>, boost::di::v1_1_0::aux::integral_constant<bool, true> >}; typename boost::di::v1_1_0::aux::enable_if<boost::di::v1_1_0::core::provider<boost::di::v1_1_0::aux::pair<T, boost::di::v1_1_0::aux::pair<TInitialization, TList<TCtor ...> > >, TName, TInjector>::is_creatable< <template-parameter-2-1>, TArgs>::value, int>::type <anonymous> = 0; T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; TName = boost::di::v1_1_0::no_name; TInjector = boost::di::v1_1_0::core::injector<boost::di::v1_1_0::extension::runtime_provider<boost::di::v1_1_0::extension::assert_error_policy, boost::di::v1_1_0::extension::shared_config>, boost::di::v1_1_0::core::pool<> >; TInitialization = boost::di::v1_1_0::type_traits::direct; TList = boost::di::v1_1_0::aux::type_list; TCtor = {boost::di::v1_1_0::core::any_type_ref_fwd<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> > >, boost::di::v1_1_0::core::any_type_ref_fwd<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> > >}]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/include/boost/di.hpp:2402:20:   required from ‘auto boost::di::v1_1_0::core::provider<boost::di::v1_1_0::aux::pair<T, boost::di::v1_1_0::aux::pair<TInitialization, TList<TCtor ...> > >, TName, TInjector>::get(const TMemory&) const [with TMemory = boost::di::v1_1_0::type_traits::stack; T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; TName = boost::di::v1_1_0::no_name; TInjector = boost::di::v1_1_0::core::injector<boost::di::v1_1_0::extension::runtime_provider<boost::di::v1_1_0::extension::assert_error_policy, boost::di::v1_1_0::extension::shared_config>, boost::di::v1_1_0::core::pool<> >; TInitialization = boost::di::v1_1_0::type_traits::direct; TList = boost::di::v1_1_0::aux::type_list; TCtor = {boost::di::v1_1_0::core::any_type_ref_fwd<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> > >, boost::di::v1_1_0::core::any_type_ref_fwd<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> > >}]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/include/boost/di.hpp:1911:81:   [ skipping 5 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:154:60:   required from ‘auto boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::make_impl(boost::di::v1_1_0::aux::pair<TInit, boost::di::v1_1_0::aux::type_list<Ts ...> >) [with T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; TInit = boost::di::v1_1_0::type_traits::direct; Ts = {boost::di::v1_1_0::core::any_type_ref_fwd<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> > >, boost::di::v1_1_0::core::any_type_ref_fwd<boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> > >}; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:158:55:   required by substitution of ‘template<class T, class TBinding> decltype (make_impl<T>(typename boost::di::v1_1_0::ctor_traits<T>::type{})) boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::make(const TBinding&) [with T = boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >; TBinding = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:125:37:   required from ‘boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&)::<lambda()> [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:124:84:   required from ‘struct boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]::<lambda()>’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/extension/include/boost/di/extension/providers/runtime_provider.hpp:124:75:   required from ‘void boost::di::v1_1_0::extension::detail::injector<TErrorPolicy, TScopeTraits>::install(const T&) [with T = boost::di::v1_1_0::core::dependency<boost::di::v1_1_0::scopes::instance, int, boost::di::v1_1_0::extension::shared_factory_impl<int, false, main()::<lambda(const auto:3&)> >, boost::di::v1_1_0::no_name, void, boost::di::v1_1_0::core::none>; typename std::enable_if<(! std::is_base_of<boost::di::v1_1_0::core::injector_base, T>::value), int>::type <anonymous> = 0; TErrorPolicy = boost::di::v1_1_0::extension::assert_error_policy; TScopeTraits = boost::di::v1_1_0::extension::shared_config]’
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/main.cpp:16:5:   required from here
/home/cdu/CLionProjects/poc-boost-di-runtime-injector/3rdparty/boost-di/include/boost/di.hpp:2451:41: error: returning reference to temporary [-Werror=return-local-addr]
   inline operator T() noexcept { return wrapper_; }
                                         ^
cc1plus: all warnings being treated as errors
gmake[3]: *** [CMakeFiles/main.dir/main.cpp.o] Error 1
gmake[2]: *** [CMakeFiles/main.dir/all] Error 2
gmake[1]: *** [CMakeFiles/main.dir/rule] Error 2
gmake: *** [main] Error 2

Steps to Reproduce the Problem

  1. Compile the sample code
  2. The compilation failed with the above error messages

Specifications