google / fruit

Fruit, a dependency injection framework for C++

Home Page:https://github.com/google/fruit/wiki

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Using parameterized constructor for Injection

rhythmize opened this issue · comments

How can I use a parameterized constructor with INJECT macro or registerConstructor()?

The parameters can be primitive data types.

class GreeterImpl {
private:
    int value;
    Writer* writer;

public:
    INJECT(GreeterImpl(Writer* writer, ASSISTED(int) val))
            : writer(writer), value(val) {
    }
    virtual void greet() {
        writer->write("Hello world!\n");
    }
};

fruit::Component<Greeter> getGreeterComponent() {
    return fruit::createComponent();
}

On compilation, I get following error at fruit::createComponent()

invalid use of incomplete type 'struct fruit::impl::meta::IsInjectableBareType::applyfruit::impl::meta::None'

Please suggest

In file included from /usr/local/include/fruit/impl/meta/vector.h:21:0,
                 from /usr/local/include/fruit/impl/meta/immutable_set.h:22,
                 from /usr/local/include/fruit/impl/meta/set.h:21,
                 from /usr/local/include/fruit/impl/injection_errors.h:21,
                 from /usr/local/include/fruit/fruit.h:25,
                 from main.cpp:12:
/usr/local/include/fruit/impl/meta/eval.h: In instantiation of ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::IsInjectableBareType(fruit::impl::meta::NormalizeType (*)(fruit::impl::meta::Type<fruit::Assisted<int> >))>’:
/usr/local/include/fruit/impl/meta/eval.h:117:87:   required from ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::IsInjectableType (*)(fruit::impl::meta::Type<fruit::Assisted<int> >)>’
/usr/local/include/fruit/impl/meta/logical_operations.h:33:23:   required from ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::Not (*)(fruit::impl::meta::IsInjectableType (*)(fruit::impl::meta::Type<fruit::Assisted<int> >))>’
/usr/local/include/fruit/impl/meta/eval.h:202:102:   required from ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::If(fruit::impl::meta::Not (*)(fruit::impl::meta::IsInjectableType (*)(fruit::impl::meta::Type<fruit::Assisted<int> >)), fruit::impl::meta::ConstructError (*)(fruit::impl::NonInjectableTypeErrorTag, fruit::impl::meta::Type<fruit::Assisted<int> >), fruit::impl::meta::None)>’
/usr/local/include/fruit/impl/meta/eval.h:117:87:   required from ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::CheckInjectableType (*)(fruit::impl::meta::Type<fruit::Assisted<int> >)>’
/usr/local/include/fruit/impl/meta/eval.h:236:106:   required from ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::PropagateError(fruit::impl::meta::CheckInjectableType (*)(fruit::impl::meta::Type<fruit::Assisted<int> >), fruit::impl::meta::None)>’
/usr/local/include/fruit/impl/meta/eval.h:102:87:   [ skipping 35 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/local/include/fruit/impl/meta/eval.h:117:87:   required from ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::ComponentFunctor::apply<fruit::impl::meta::ConvertComponent, fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::type (*)(fruit::impl::meta::GetResult (*)(fruit::impl::meta::ProcessDeferredBindings (*)(fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList>)))>’
/usr/local/include/fruit/impl/meta/eval.h:249:106:   required from ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::PropagateError (*)(fruit::impl::meta::ComponentFunctor::apply<fruit::impl::meta::ConvertComponent, fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::type (*)(fruit::impl::meta::GetResult (*)(fruit::impl::meta::ProcessDeferredBindings (*)(fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList>))), fruit::impl::meta::Compose2ComponentFunctors::apply<fruit::impl::meta::ProcessDeferredBindings, fruit::impl::meta::ComponentFunctor::apply<fruit::impl::meta::ConvertComponent, fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::type>::type::apply<fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::Op)>’
/usr/local/include/fruit/impl/meta/eval.h:220:51:   required from ‘struct fruit::impl::meta::EvalPropagateError<fruit::impl::meta::ComponentFunctorIdentity::apply<fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::type, fruit::impl::meta::PropagateError (*)(fruit::impl::meta::ComponentFunctor::apply<fruit::impl::meta::ConvertComponent, fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::type (*)(fruit::impl::meta::GetResult (*)(fruit::impl::meta::ProcessDeferredBindings (*)(fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList>))), fruit::impl::meta::Compose2ComponentFunctors::apply<fruit::impl::meta::ProcessDeferredBindings, fruit::impl::meta::ComponentFunctor::apply<fruit::impl::meta::ConvertComponent, fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::type>::type::apply<fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::Op)>’
/usr/local/include/fruit/impl/meta/eval.h:236:106:   required from ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::PropagateError(fruit::impl::meta::ProcessDeferredBindings (*)(fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList>), fruit::impl::meta::PropagateError (*)(fruit::impl::meta::ComponentFunctor::apply<fruit::impl::meta::ConvertComponent, fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::type (*)(fruit::impl::meta::GetResult (*)(fruit::impl::meta::ProcessDeferredBindings (*)(fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList>))), fruit::impl::meta::Compose2ComponentFunctors::apply<fruit::impl::meta::ProcessDeferredBindings, fruit::impl::meta::ComponentFunctor::apply<fruit::impl::meta::ConvertComponent, fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::type>::type::apply<fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> >::Op))>’
/usr/local/include/fruit/impl/meta/eval.h:102:87:   required from ‘struct fruit::impl::meta::DoEval<fruit::impl::meta::Call(fruit::impl::meta::ReverseComposeFunctors (*)(fruit::impl::meta::ComponentFunctor (*)(fruit::impl::meta::ConvertComponent, fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList>), fruit::impl::meta::ProcessDeferredBindings), fruit::impl::meta::ConstructComponentImpl (*)())>’
/usr/local/include/fruit/impl/meta/eval.h:253:45:   required by substitution of ‘template<class MetaExpr> using Eval = typename fruit::impl::meta::DoEval::type [with MetaExpr = fruit::impl::meta::Call(fruit::impl::meta::ReverseComposeFunctors (*)(fruit::impl::meta::ComponentFunctor (*)(fruit::impl::meta::ConvertComponent, fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList>), fruit::impl::meta::ProcessDeferredBindings), fruit::impl::meta::ConstructComponentImpl (*)())]’
/usr/local/include/fruit/impl/component.defn.h:39:57:   required by substitution of ‘template<class ... PreviousBindings> template<class Comp> using ConvertTo = fruit::impl::meta::Eval<fruit::impl::meta::Call(fruit::impl::meta::ReverseComposeFunctors (*)(fruit::impl::meta::ComponentFunctor (*)(fruit::impl::meta::ConvertComponent, Comp), fruit::impl::meta::ProcessDeferredBindings, fruit::impl::meta::Id<fruit::impl::meta::ProcessBinding(PreviousBindings)>...), fruit::impl::meta::ConstructComponentImpl (*)())> [with Comp = fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Type<Greeter> >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<Greeter>, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList>; PreviousBindings = {}]’
/usr/local/include/fruit/impl/component.defn.h:55:95:   required from ‘fruit::Component<Types>::Component(fruit::PartialComponent<Bindings ...>&&) [with Bindings = {}; Params = {Greeter}]’
/main.cpp:52:35:   required from here
/usr/local/include/fruit/impl/meta/eval.h:102:87: error: invalid use of incomplete type ‘struct fruit::impl::meta::IsInjectableBareType::apply<fruit::impl::meta::None>’
       MetaFun>::type::template apply<typename DoEval<MetaExprs>::type...>::type>::type;
                                                                                       ^
In file included from /usr/local/include/fruit/impl/data_structures/fixed_size_allocator.h:21:0,
                 from /usr/local/include/fruit/impl/injector/injector_storage.h:21,
                 from /usr/local/include/fruit/impl/component_functors.defn.h:24,
                 from /usr/local/include/fruit/component.h:25,
                 from /usr/local/include/fruit/fruit.h:27,
                 from main.cpp:12:
/usr/local/include/fruit/impl/meta/component.h:606:10: note: declaration of ‘struct fruit::impl::meta::IsInjectableBareType::apply<fruit::impl::meta::None>’
   struct apply;
          ^~~~~

Please Check

But, for injecting objects of a class will injectFactory work? I mean documentation and examples recommend registerConstructor for this purpose.

Okay, I'll give it a shot

There was no further activity here, assuming that this has been resolved.
If not feel free to reopen.