使用std :: map的Visual Studio 11编译时错误

时间:2012-05-06 00:18:50

标签: c++ visual-studio gcc compiler-errors

以下代码使用gcc-4.5.1编译,但不在Visual Studio 11中编译。

#include <map>
#include <array>

typedef std::pair<const unsigned int, std::array<const unsigned int, 4>> pairus;

int main(){

   std::map<const unsigned int, std::array<const unsigned int, 4> > x; 
   std::array<const unsigned int, 4> troll = {1, 2, 3, 4};
   x.insert(pairus(1, troll));

   auto z = x[1];
}

1现在映射到std::array<> troll。插入效果很好,程序编译。但是,只要我尝试auto z = x[1] - &gt;因此,尝试获取1映射到的数组troll时,程序无法编译并出现以下错误:

error C2512: 'std::array<_Ty,_Size>::array':没有合适的默认构造函数

是什么导致gcc和vs11之间的行为差​​异以及如何修复它?

感谢。

2 个答案:

答案 0 :(得分:4)

请尝试使用auto z = *x.find(1);[] - 运算符需要默认可构造类型。实际上,整个容器需要一个默认构造类型,所以当你尝试各种实现时,你真的不能指望任何东西,而是随机运气。

答案 1 :(得分:3)

您的类型不可分配,因为它包含常量。

x [1]尝试返回可分配的引用。如果密钥尚未存在,它还将为密钥构造一个空值。这两种都不适用于您的类型。你将不得不使用find。