Я подумываю перенести наш магазин на VS2010 с VS2008sp1. Я был очень доволен 2008 годом, но хотел бы использовать TR1 в нашем коде.
Мне действительно интересны коллеги-программисты Гештальт 2010 v. 2008, а не решение какого-либо из следующих элементов!
Тем не менее, я нахожусь в процессе преобразования наших проектов и решений, и я обнаружил, что отношение «шум к сигналу» довольно слабое, ИМО. Пока я смотрю на перемонтирование каждого отдельного проекта, который нам нужен, чтобы избавиться от различных, по-видимому, ложных предупреждений Microsoft Build, таких как $ (TargetExt) ... не совпадает со значением свойства OutputFile в Linker's ...
Существует несколько вариантов этого сообщения, по несколько на проект, и у нас около 75 проектов. У меня мало или нет желания тратить свое время на переделку всех выходных целей всех этих проектов (по-видимому, MSBuild настаивает на том, чтобы цель компоновщика и цель компилятора были идентичными, что не является ни необходимым, ни желательным для нас).
Кроме того, [смущение], мы все еще используем VSS. И только в моих первых попытках согласовать проекты с MSBuild, я обнаружил, что интерфейс VSS в VS2010 примерно на 1/4 быстрее, чем в 2008 году. Это ужасно (и я привык к довольно неудачному производительность VSS в целом).
Вздох ... Я знаю, что около 1/2 или более "ответов" будут "Прекратить использование VSS". Да, это отличная идея, и мы можем перейти к подрывной деятельности в не слишком отдаленном будущем. Но по одному за раз. Это только решает проблему скорости VSS, но не проблемы MSBuild и не новые проблемы C ++.
Кажется, что новые стандартные библиотеки и TR1 испортили часть нашего кода. Это само по себе не шокирует - я бы удивился, если бы это было не так. Но как бы там ни было, сообщения об ошибках - LOOOONNNNNGGGG - это напоминает мне о моих ранних днях попыток использовать STL и необходимости загружать вспомогательный анализатор строк ошибок, который выводил для меня имена более высокого уровня, чтобы сообщения об ошибках могли стать несколько полезно. Теперь, 10 лет спустя, я вернулся к диагностике, настолько глубокой и запутанной, что она не имеет смысла, и я понятия не имею, в чем реальная проблема. В одном случае я пытаюсь вставить новый элемент в мультикарту:
typedef CCimexDataSource::CategoryID CategoryID;
typedef std::multimap<CString, CCimexDataSource *> description_sources_multimap;
typedef std::map<CategoryID, description_sources_multimap> category_sources_map;
// attempt to insert a new description->CCimexDataSource* keyed by CategoryID (an unsigned)
m_category_sources_map[it->GetCategory()].insert(std::make_pair(it->GetDescription(), &(*it)));
И я получаю:
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(163): error C2440: 'initializing' : cannot convert from 'const CCimexDataSource *' to 'CCimexDataSource *'
1> Conversion loses qualifiers
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(255) : see reference to function template instantiation 'std::_Pair_base<_Ty1,_Ty2>::_Pair_base<_Ty,const CCimexDataSource>(_Other1 &&,_Other2 &&)' being compiled
1> with
1> [
1> _Ty1=const CString,
1> _Ty2=CCimexDataSource *,
1> _Ty=ATL::CStringT<char,StrTraitMFC<char>>,
1> _Other1=ATL::CStringT<char,StrTraitMFC<char>>,
1> _Other2=const CCimexDataSource *
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory(208) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<ATL::CStringT<BaseType,StringTraits>,const CCimexDataSource*>(std::pair<ATL::CStringT<BaseType,StringTraits>,const CCimexDataSource *> &&)' being compiled
1> with
1> [
1> _Ty1=const CString,
1> _Ty2=CCimexDataSource *,
1> BaseType=char,
1> StringTraits=StrTraitMFC<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory(280) : see reference to function template instantiation 'void std::allocator<_Ty>::construct<std::pair<_Ty1,_Ty2>>(std::pair<const _Kty,CCimexDataSource> *,_Other &&)' being compiled
1> with
1> [
1> _Ty=std::pair<const CString,CCimexDataSource *>,
1> _Ty1=ATL::CStringT<char,StrTraitMFC<char>>,
1> _Ty2=const CCimexDataSource *,
1> _Kty=CString,
1> _Other=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree(592) : see reference to function template instantiation 'void std::_Cons_val<std::allocator<_Ty>,_Ty,std::pair<_Ty1,_Ty2>>(_Alloc &,std::pair<const _Kty,CCimexDataSource> *,std::pair<_Ty1,_Ty2> &&)' being compiled
1> with
1> [
1> _Ty=std::pair<const CString,CCimexDataSource *>,
1> _Ty1=ATL::CStringT<char,StrTraitMFC<char>>,
1> _Ty2=const CCimexDataSource *,
1> _Alloc=std::allocator<std::pair<const CString,CCimexDataSource *>>,
1> _Kty=CString
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree(755) : see reference to function template instantiation 'std::_Tree_nod<_Traits>::_Node *std::_Tree_val<_Traits>::_Buynode<_Ty>(_Valty &&)' being compiled
1> with
1> [
1> _Traits=std::_Tmap_traits<CString,CCimexDataSource *,std::less<CString>,std::allocator<std::pair<const CString,CCimexDataSource *>>,true>,
1> _Ty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *>,
1> _Valty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\map(364) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert<_Ty>(_Valty &&)' being compiled
1> with
1> [
1> _Ty1=std::_Tree_iterator<std::_Tree_val<std::_Tmap_traits<CString,CCimexDataSource *,std::less<CString>,std::allocator<std::pair<const CString,CCimexDataSource *>>,true>>>,
1> _Ty2=bool,
1> _Traits=std::_Tmap_traits<CString,CCimexDataSource *,std::less<CString>,std::allocator<std::pair<const CString,CCimexDataSource *>>,true>,
1> _Ty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *>,
1> _Valty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *>
1> ]
1> c:\users\steve\projects\cimex cad-cam\14.0\cimex application\cimcad\formaddautomaticpage.h(17) : see reference to function template instantiation 'std::_Tree_iterator<_Mytree> std::multimap<_Kty,_Ty>::insert<std::pair<_Ty1,_Ty2>>(_Valty &&)' being compiled
1> with
1> [
1> _Mytree=std::_Tree_val<std::_Tmap_traits<CString,CCimexDataSource *,std::less<CString>,std::allocator<std::pair<const CString,CCimexDataSource *>>,true>>,
1> _Kty=CString,
1> _Ty=CCimexDataSource *,
1> _Ty1=ATL::CStringT<char,StrTraitMFC<char>>,
1> _Ty2=const CCimexDataSource *,
1> _Valty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *>
1> ]
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(163): error C2439: 'std::_Pair_base<_Ty1,_Ty2>::second' : member could not be initialized
1> with
1> [
1> _Ty1=const CString,
1> _Ty2=CCimexDataSource *
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(167) : see declaration of 'std::_Pair_base<_Ty1,_Ty2>::second'
1> with
1> [
1> _Ty1=const CString,
1> _Ty2=CCimexDataSource *
1> ]
Примечание: вышеприведенное выглядит как изменение работы std :: set <>, так что они всегда возвращают const_iterators вместо итераторов (1). Но дело только в том, чтобы иметь пример того, насколько более запутанна диагностика компилятора по сравнению с 2008 годом.
Итак, мой вопрос: для каких-либо магазинов с ++, которые недавно конвертировали: вы сожалеете о конверсии или цените ее? Как так?
(1) Скотт Мейер "Effective STL", (c) 2001, p95, item 22.
Я только что наткнулся на это: оно охватывает многие из изменений, нарушающих код, с которыми я столкнулся:
http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx?wa=wsignin1.0