example.cpp(17):error С2440:'initializing': cannot convert from 'class std::_Tree,class std::allocator >,struct std::pair.class std::allocator > const.class std::basic_string.class std::allocator > >.struct std::map,class std::allocator >,class std::basic_string.class std::allocator >,struct std::less.class std::allocator > >,class std::allocator,class std::allocator > > >::_Kfn.struct std::less,class std::allocator > >,class std::allocator,class std::allocator > > >::const_iterator' to 'class std::_Tree,class std::allocator >.struct std::pair.class std::allocator > const.class std::basic_string,class std::allocator > >.struct std::map.class std::allocator >.class std: std::char_traits.class std::allocator >,struct std std::basic_string.class std basic_st ring >,struct std::less.class std::allocator > >.class std::allocator.class std::allocator : basic_string.class std::allocator >.struct std std::char_traits.class std: std::basic_string > const.class::char traits.class std::allocator >,struct std::map.class std::allocator >.class std std::allocator >.struct std std::char_traits,class std: std::basic_string > >.class std basic_string.class less > >,class std char_traits,class std: basic string > > > :char traits,class :allocator.class std::allocator > > >:iterator'
No constructor could take the source type, or constructor overload resolution was ambiguous
Сообщение состоит из 2095 символов и выглядит довольно устрашающе, но я видал и похуже. Например, одна из моих любимых платформ STL однажды выдала сообщение из 4812 символов. Наверное, вы уже догадались, что я люблю ее совсем не за это.
Давайте немного сократим эту хаотическую запись и приведем ее к более удобному виду. Начнем с замены конструкции basic_string.. на string. Результат выглядит так:
example.cpp(17):error С2440:'initializing': cannot convert from 'class std::_Tree,struct std::map,class std::allocator > ::_Kfn.struct std::less,class std::allocator > ::const_iterator' to 'class std::_Tree,struct std::map, class std::allocator >::_Kfn,struct std::less. class std::allocator >: iterator'
No constructor could take the source type, or constructor overload resolution was ambiguous
Уже лучше. Осталось каких-нибудь 745 символов, можно начинать разбираться в сообщении. В глаза бросается упоминание шаблона std::_Тгее
. В Стандарте ничего не сказано о шаблоне с именем Tree, но мы помним, что имена, начинающиеся с символа подчеркивания и прописной буквы, зарезервированы для авторов реализаций. Перед нами один из внутренних шаблонов, используемых в реализации некой составляющей STL.Оказывается, практически во всех реализациях STL стандартные ассоциативные контейнеры (set, multiset, map и multimap) строятся на основе базовых шаблонов. По аналогии с тем, как при использовании string в диагностике упоминается тип basic_string, при работе со стандартными ассоциативными контейнерами часто выдаются сообщения с упоминанием базовых шаблонов. В данном примере этот шаблон называется _Tree, но в других известных мне реализациях встречались имена tree и _rb_tree, причем в последнем имени отражен факт использования красно-черных (Red-Black) деревьев, самой распространенной разновидности сбалансированных деревьев, встречающейся в реализациях STL.