Visual Studio 2010 Beta 1中STL的突破性更改

Visual Studio 2010 Beta 1版 现在可以下载。  我最近在博客中讨论了VS 2010 beta 1中的VisualC++ C++,我称之为VC10 beta 1,包含编译器支持五C++0x核心语言特性: lambdas,自动,静态 , R值引用 ,和 脱模 .  它还包含了C++标准库的一个基本改写的实现,支持了许多C++ 0x标准库的特性。  在不久的将来,我将在第4部分和之后的“VC10中的C++ 0x特性”中对它们进行博客,但今天我要讨论的是STL的变化,这些变化有可能打破现有代码,在玩C++ 0x的游戏之前,你可能想知道这些变化。

null

问题1:错误C3861:“backu inserter”:找不到标识符

此程序使用VC9 SP1编译并运行干净:

C:温度>类型backu inserter.cpp

#包含<算法>

#包括

#包括

#包括

使用名称空间标准;

整数平方(const int n){

返回n*n;

}

int main(){

向量v;

v、 推回(11);

v、 推回(22);

v、 推回(33);

向量dest;

变换(v.begin(),v.end(),backu inserter(dest),square);

对于(vector::const_iterator i=dest.begin();我!=目标端()++(一){

cout<<*i<

}

}

C:温度>cl/EHsc/nologo/W4背面插入器.cpp

背面插入器.cpp

C:温度>背面插入器

121

484

1089

但它无法用VC10 Beta 1编译:

C:温度>cl/EHsc/nologo/W4背面插入器.cpp

背面插入器.cpp

backu inserter.cpp(19):错误C3861:’backu inserter’:找不到标识符

怎么了?

解决方案:#包括

问题是 背面插入器() 使用时不包括。  C++标准库头以非指定的方式相互包含。  ““未指定”表示标准允许但不要求任何标题X包含任何标题Y。  此外,实现(如Visual C++)不需要记录它们所做的事情,并且允许它们从版本到版本(或根据月亮的相位或其他任何东西)改变它们所做的。  这就是这里发生的事。  在VC9 SP1中,包括拖入。  在VC10 Beta 1中,不会拖入

当使用C++标准库组件时,您应该小心地包括它的头(即标准所说的应该被嵌入的标头)。  这使得您的代码具有可移植性,并且不受像这样的实现更改的影响。

可能有更多的地方不再在其他标题中拖拽标题,但是绝对是人们忘记包含的最流行的标题。

注:范围插入和范围构造

顺便问一下,什么时候 序号 是一个 矢量 , 德克 ,或 列表 ,而不是这样写:

复制(第一个、最后一个、后一个插入器(seq));//糟糕!

你应该这样写:

seq.insert(seq.end(),first,last);//范围插入-好!

或者,如果你在建造 序号 ,只需写下:

向量seq(first,last);//靶场建设-好!

他们不仅打字稍微少一点,而且效率也明显提高。 复制() -至- 背面插入器() 电话 向后推() 重复,这可能会触发多个 矢量 重新分配。  给定前向迭代器或更好的迭代器,范围插入和范围构造只需计算您有多少个元素,并一次为所有元素分配足够的空间。  这对其他人来说也更有效 德克 ,你也可以为我做这件事 列表 我也是。

问题2:错误C2664:’std::vector::u Inside’:无法将参数1从’IUnknown**’转换为’const ATL::CComPtr*’

此程序使用VC9 SP1编译并运行干净:

C:Temp>类型vectoru ccomptr.cpp

#包括

#包括

#包括

#包括

#包括

使用名称空间标准;

int main(){

向量v;

v、 推回(空);

}

C:Temp>cl/EHsc/nologo/W4矢量

矢量压缩.cpp

C:温度>矢量计算机

C:温度>

但它无法用VC10 Beta 1编译:

C:Temp>cl/EHsc/nologo/W4矢量

矢量压缩.cpp

C:程序文件Microsoft Visual Studio 10.0VCINCLUDEvector(623):错误C2664:’std::vector::u Inside’:无法将参数1从’IUnknown**’转换为’const ATL::CComPtr*’

具有

[

_Ty=ATL::CComPtr

]

[

T=未知

]

指向的类型不相关;转换需要重新解释类型转换、C样式转换或函数样式转换

C:程序文件Microsoft Visual Studio 10.0VCINCLUDEvector(622):编译类模板成员函数’void std::vector::push u back(u Ty&&&)’

具有

[

_Ty=ATL::CComPtr

]

cpp(9):请参阅正在编译的类模板实例化’std::vector

具有

[

_Ty=ATL::CComPtr

]

C:程序文件Microsoft Visual Studio 10.0VCINCLUDEvector(625):错误C2040:“-”:“IUnknown**”与“ATL::CComPtr*”的间接寻址级别不同

具有

[

T=未知

]

怎么了?

解决方案:使用CAdapt

标准容器禁止元素重载运算符的地址。 计算机 重载运算符的地址。  因此, 向量 是禁止的(它会触发未定义的行为)。  它碰巧在VC9SP1中工作,但在VC10Beta1中不工作。  那是因为 矢量 现在使用中运算符的地址 向后推() ,以及其他地方。

解决方案是使用 卡达普 ,其唯一目的是包装重载类型的地址,以供标准容器使用。 向量 会很好的。  在VC10 Beta 1中,我添加了 操作员->() 卡达普 ,允许 v[i]->某物() 原封不动地编译。  但是,通常在添加 卡达普 你的节目。 操作员。() 不能超载,所以如果你打电话 计算机 的成员函数 发布() ,你需要通过 卡达普 的公共数据成员 穆特 .  例如, v[i].Release() 需要转化为 v[i].mT.Release() .  另外,如果您依赖于隐式转换, 卡达普 添加一个额外的层,这将干扰它们。  因此,您可能需要在将对象推回到 矢量

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享