我正在考虑将我们的商店从 VS2008sp1 迁移到 VS2010。我对 2008 年非常满意,但希望在我们的代码中使用 TR1。
我对 2010 年与 2008 年的程序员同行真正感兴趣,而不是对以下任何一个元素的解决方案!
但是,我正在转换我们的项目和解决方案,我发现“噪声与信号”的比率相当蹩脚,IMO。到目前为止,我正在考虑重新连接每个项目,以消除各种明显虚假的 Microsoft Build 警告,例如 $(TargetExt) ...与链接器的 OutputFile 属性值不匹配...
此消息有多种变体,每个项目都有多种变体,我们大约有 75 个项目。我很少或根本不想浪费时间重做所有这些项目的输出目标(显然 MSBuild 坚持要求链接器的目标和编译器的目标相同,这对我们来说既没有必要也不可取)。
另外,[尴尬]我们还是用VSS。就在我最初尝试调整项目以使其符合 MSBuild 的过程中,我发现 VS2010 中的 VSS 界面速度大约是 2008 年的 1/4。这太糟糕了(而且我已经习惯了相对蹩脚的界面)。 VSS 的总体性能)。
叹息...我知道大约 1/2 或更多的“答案”将是“停止使用 VSS”。是的,这是一个好主意,我们可能会在不久的将来转向颠覆。但一次只做一件事。这只能解决 VSS 速度问题,不能解决 MSBuild 问题,也不能解决新的 C++ 问题。
新的标准库和 TR1 内容似乎破坏了我们的一些代码。这本身并不算太令人震惊——如果情况并非如此,我会感到惊讶。但就目前情况而言,错误消息是 LOOOONNNNNGGGG - 它让我想起了我早期尝试使用 STL 的日子,并且必须加载一个错误字符串解析器帮助程序,该帮助程序为我推导出更高级别的名称,以便错误消息可能变得有点有用。现在,十年后,我再次看到诊断如此深入和复杂,以至于毫无意义,我不知道真正的问题是什么。在一种情况下,我尝试在多重映射中插入一个新元素:
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 而不是 iterators(1)。但重点只是提供一个示例,说明与 2008 年相比,编译器诊断要复杂得多。
所以,我的问题是:对于最近进行转换的任何 C++ 商店:您对转换感到遗憾还是感激?怎么会这样?
(1) Scott Meyer 的“Effective STL”,(c) 2001,第 95 页,第 22 项。
我刚刚遇到了这个:它涵盖了我遇到的许多代码破坏性更改: http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx?wa=wsignin1.0
最佳答案
回答您的第一个问题:&(*it)
的类型可能是 const CCimexDataSource *
,而不是 CCimexDataSource *
。
就您的第二个讨论问题提供意见: 我们已经从 VS2008 转换到 VS2010,效果很好,虽然 VS2010 速度较慢,但它具有更好的智能感知。转换不是全自动的,之后我们必须手动更新 vcxproj 文件。
关于c++ - 反馈: C++ developers who've switched to VS2010?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587418/