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的游戏之前,你可能想知道这些变化。
问题1:错误C3861:“backu inserter”:找不到标识符
此程序使用VC9 SP1编译并运行干净:
C:温度>类型backu inserter.cpp
#包含<算法>
#包括
#包括
#包括
使用名称空间标准;
整数平方(const int n){
返回n*n;
}
int main(){
向量
v、 推回(11);
v、 推回(22);
v、 推回(33);
向量
变换(v.begin(),v.end(),backu inserter(dest),square);
对于(vector
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++标准库组件时,您应该小心地包括它的头(即标准所说的应该被嵌入的标头)。 这使得您的代码具有可移植性,并且不受像这样的实现更改的影响。
可能有更多的地方不再在其他标题中拖拽标题,但是
注:范围插入和范围构造
顺便问一下,什么时候 序号 是一个 矢量 , 德克 ,或 列表 ,而不是这样写:
复制(第一个、最后一个、后一个插入器(seq));//糟糕!
你应该这样写:
seq.insert(seq.end(),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
具有
[
_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中不工作。 那是因为 矢量 现在使用中运算符的地址 向后推() ,以及其他地方。
解决方案是使用