initialize a map with lambda functions as values [closed]

1 day ago 1
ARTICLE AD BOX

I am trying to initialize a map in a contructor function of a factory class. The map has strings as keys and lambda functions as values. The lambda functions are themselves constructor to other classes all inheriting from the "IComponent" interface. This piece of code reproduces the error i am getting :

#include <iostream> #include <memory> #include <functional> #include <map> namespace Mynamespace { class IComponent { virtual ~IComponent() = default; }; } namespace Mynamespace { class Input { public: Input(); ~Input(); }; } namespace Mynamespace { class Output { public: Output(); ~Output(); }; } namespace Mynamespace { class Factory { private: std::map<const std::string, std::function<std::unique_ptr<Mynamespace::IComponent>()>> Map; public: Factory(); void initializeMap(); } void Mynamespace::Factory::initializeMap() { Map = { {"input", [](){return std::make_unique<Mynamespace::Input>();}}, {"output", [](){return std::make_unique<Mynamespace::Output>();}} }; }

the error message :

test.cpp:39:2: error: expected ‘;’ after class definition 39 | } | ^ | ; test.cpp: In member function ‘void Mynamespace::Factory::initializeMap()’: test.cpp:46:5: error: no match for ‘operator=’ (operand types are ‘std::map<const std::__cxx11::basic_string<char>, std::function<std::unique_ptr<Mynamespace::IComponent>()> >’ and ‘<brace-enclosed initializer list>’) 46 | }; | ^ In file included from /usr/include/c++/13/map:63, from test.cpp:4: /usr/include/c++/13/bits/stl_map.h:331:7: note: candidate: ‘std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = const std::__cxx11::basic_string<char>; _Tp = std::function<std::unique_ptr<Mynamespace::IComponent>()>; _Compare = std::less<const std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::function<std::unique_ptr<Mynamespace::IComponent>()> > >]’ 331 | operator=(const map&) = default; | ^~~~~~~~ /usr/include/c++/13/bits/stl_map.h:331:17: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const std::map<const std::__cxx11::basic_string<char>, std::function<std::unique_ptr<Mynamespace::IComponent>()> >&’ 331 | operator=(const map&) = default; | ^~~~~~~~~~ /usr/include/c++/13/bits/stl_map.h:335:7: note: candidate: ‘std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = const std::__cxx11::basic_string<char>; _Tp = std::function<std::unique_ptr<Mynamespace::IComponent>()>; _Compare = std::less<const std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::function<std::unique_ptr<Mynamespace::IComponent>()> > >]’ 335 | operator=(map&&) = default; | ^~~~~~~~ /usr/include/c++/13/bits/stl_map.h:335:17: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘std::map<const std::__cxx11::basic_string<char>, std::function<std::unique_ptr<Mynamespace::IComponent>()> >&&’ 335 | operator=(map&&) = default; | ^~~~~ /usr/include/c++/13/bits/stl_map.h:349:7: note: candidate: ‘std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(std::initializer_list<std::pair<const _Key, _Val> >) [with _Key = const std::__cxx11::basic_string<char>; _Tp = std::function<std::unique_ptr<Mynamespace::IComponent>()>; _Compare = std::less<const std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::function<std::unique_ptr<Mynamespace::IComponent>()> > >]’ 349 | operator=(initializer_list<value_type> __l) | ^~~~~~~~ /usr/include/c++/13/bits/stl_map.h:349:46: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘std::initializer_list<std::pair<const std::__cxx11::basic_string<char>, std::function<std::unique_ptr<Mynamespace::IComponent>()> > >’ 349 | operator=(initializer_list<value_type> __l) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ test.cpp: At global scope: test.cpp:47:2: error: expected ‘}’ at end of input 47 | } | ^ test.cpp:32:1: note: to match this ‘{’ 32 | {
Read Entire Article