Проблема хранение ссылок на экземпляр в map

80
04 марта 2022, 19:00

Пытаюсь хранить ссылки на экземпляры Test в map из stl c++, но компилятор ругается

class Test { };
class SomeClass {
    map<std::string, Test&> _map;
public:
    Test& find_Test(std::string name) { return _map[name]; }
};

Подскажите, пожалуйста, что я делаю не так?

In file included from D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/unique_ptr.h:37:0,
                 from D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/locale_conv.h:41,
                 from D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/locale:43,
                 from D:/Libraries/SFML/include/SFML/System/Utf.hpp:33,
                 from D:/Libraries/SFML/include/SFML/System/String.hpp:32,
                 from D:/Libraries/SFML/include/SFML/System.hpp:42,
                 from D:/Libraries/SFML/include/SFML/Audio.hpp:32,
                 from D:\ivan\Study\C & C++\problems3_laptop2\Pseudo3DEngine\main.cpp:1:
D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/tuple: In instantiation of 'std::pair<_T1, _T2>::pair(std::tuple<_Args1 ...>&, std::tuple<_Args2 ...>&, std::_Index_tuple<_Indexes1 ...>, std::_Index_tuple<_Indexes2 ...>) [with _Args1 = {const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&}; long long unsigned int ..._Indexes1 = {0}; _Args2 = {}; long long unsigned int ..._Indexes2 = {}; _T1 = const std::__cxx11::basic_string<char>; _T2 = Test&]':
D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/tuple:1641:63:   required from 'std::pair<_T1, _T2>::pair(std::piecewise_construct_t, std::tuple<_Args1 ...>, std::tuple<_Args2 ...>) [with _Args1 = {const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&}; _Args2 = {}; _T1 = const std::__cxx11::basic_string<char>; _T2 = Test&]'
D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/ext/new_allocator.h:136:4:   required from 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = std::pair<const std::__cxx11::basic_string<char>, Test&>; _Args = {const std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _Tp = std::_Rb_tree_node<std::pair<const std::__cxx11::basic_string<char>, Test&> >]'
D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/alloc_traits.h:475:4:   required from 'static void std::allocator_traits<std::allocator<_CharT> >::construct(std::allocator_traits<std::allocator<_CharT> >::allocator_type&, _Up*, _Args&& ...) [with _Up = std::pair<const std::__cxx11::basic_string<char>, Test&>; _Args = {const std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _Tp = std::_Rb_tree_node<std::pair<const std::__cxx11::basic_string<char>, Test&> >; std::allocator_traits<std::allocator<_CharT> >::allocator_type = std::allocator<std::_Rb_tree_node<std::pair<const std::__cxx11::basic_string<char>, Test&> > >]'
D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_tree.h:626:32:   required from 'void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_construct_node(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type, _Args&& ...) [with _Args = {const std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _Key = std::__cxx11::basic_string<char>; _Val = std::pair<const std::__cxx11::basic_string<char>, Test&>; _KeyOfValue = std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, Test&> >; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, Test&> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type = std::_Rb_tree_node<std::pair<const std::__cxx11::basic_string<char>, Test&> >*]'
D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_tree.h:643:21:   required from 'std::_Rb_tree_node<_Val>* std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_create_node(_Args&& ...) [with _Args = {const std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _Key = std::__cxx11::basic_string<char>; _Val = std::pair<const std::__cxx11::basic_string<char>, Test&>; _KeyOfValue = std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, Test&> >; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, Test&> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type = std::_Rb_tree_node<std::pair<const std::__cxx11::basic_string<char>, Test&> >*]'
D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_tree.h:2398:33:   required from 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_emplace_hint_unique(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator, _Args&& ...) [with _Args = {const std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _Key = std::__cxx11::basic_string<char>; _Val = std::pair<const std::__cxx11::basic_string<char>, Test&>; _KeyOfValue = std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, Test&> >; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, Test&> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, Test&> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::__cxx11::basic_string<char>, Test&> >]'
D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_map.h:493:8:   required from 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = std::__cxx11::basic_string<char>; _Tp = Test&; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, Test&> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = Test&; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::__cxx11::basic_string<char>]'
D:\ivan\Study\C & C++\problems3_laptop2\Pseudo3DEngine\main.cpp:17:57:   required from here
D:/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/tuple:1652:70: error: value-initialization of reference type 'Test&'
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^
mingw32-make.exe[3]: *** [CMakeFiles\Pseudo3DEngine.dir\build.make:63: CMakeFiles/Pseudo3DEngine.dir/main.cpp.obj] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:72: CMakeFiles/Pseudo3DEngine.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:84: CMakeFiles/Pseudo3DEngine.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:117: Pseudo3DEngine] Error 2
Answer 1

Оператор [] при отсутствии в контейнере запрашиваемого элемента создает его инициализируя конструктором по-умолчанию, что невозможно выполнить для Test &. Используйте return _map.at(name);

READ ALSO
Модульные проекты на C++ [закрыт]

Модульные проекты на C++ [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

184
Как отправить данные через USB?

Как отправить данные через USB?

Я хочу отправить данные через USB на ArduinoСам микроконтроллер запрограммирован ждать сигнал с serial-порта

86
Расшифровка названий C++

Расшифровка названий C++

Есть ли сайт где указаны все расшифровки названий для C++ (например как расшифровывается cout = console output; endl = end line; iostream = input output stream и тд

81
rvalue в параметр функции

rvalue в параметр функции

У меня имеется unique_ptr, который передаётся в функцию по значению

57