У меня my_map определен как:
std::unordered_map<MyAction, MyLine * >;
(MyAction — это перечисляемый класс)
где MyLine — это std::vector<MyPoint>;
а MyLines — это std::vector<MyLine>;
затем со следующим кодом:
for (const auto &myline : mylines) {
my_map.insert(
std::pair<MyAction, const Myline *>(MyAction::KEEP_1, &myline));
И я получил следующие ошибки:
my_utility.cpp:85:33: error: no matching member function for call to 'insert'
my_map.insert(
~~~~~~~~~~~~~~~~~~~~^~~~~~
my_project/external/clang/darwin/include/c++/v1/unordered_map:909:26: note: candidate function not viable: no known conversion from 'pair<my_namespace::MyAction, const Myline *>' to 'const pair<const std::__1::unordered_map<my_namespace::MyAction, std::__1::vector<math::Vector3<double>, std::__1::allocator<math::Vector3<double> > > *, std::__1::hash<my_namespace::MyAction>, std::__1::equal_to<my_namespace::MyAction>, std::__1::allocator<std::__1::pair<const MyAction, std::__1::vector<math::Vector3<double>, std::__1::allocator<math::Vector3<double> > > *> > >::key_type, std::__1::unordered_map<my_namespace::MyAction, std::__1::vector<math::Vector3<double>, std::__1::allocator<math::Vector3<double> > > *, std::__1::hash<my_namespace::MyAction>, std::__1::equal_to<my_namespace::MyAction>, std::__1::allocator<std::__1::pair<const MyAction, std::__1::vector<math::Vector3<double>, std::__1::allocator<math::Vector3<double> > > *> > >::mapped_type>' for 1st argument
pair<iterator, bool> insert(const value_type& __x)
^
Есть идеи, что было не так? Спасибо!
Как мне избежать этого, если мне нужно использовать const auto & в цикле for?
@Edamame: Вы не можете. Вам нужно использовать auto& в цикле или создавать новые MyLine объекты. Или вы можете сделать так, чтобы карта держалась const MyLine *





На вашей карте есть MyLine *, но в функции вставки вы также написали const. Удалите его, и он должен работать.
Если я удалил const во вставке, я получил сообщение об ошибке, говорящее clang/darwin/include/c++/v1/utility:422:5: примечание: конструктор-кандидат нежизнеспособен: 2-й аргумент ('const std::__1::vector <math::Vector3<double>, std::__1::allocator<math::Vector3<double> > > *') потеряет пару квалификаторов const(_T1 const& __t1, _T2 const& __t2) . -> Я думаю, это потому, что в цикле for я использую const auto & , но мне нужно это сделать
@Edamame Если у вас есть объект, и вы не можете его изменить, вы должны просто сохранить свою неупорядоченную карту const MyLine*.
вы отбрасываете константность. неупорядоченная карта содержит
MyLine*, но вы пытаетесь вставитьconst MyLine*