【问题标题】:Visual Studio 11 compile-time error using std::map使用 std::map 的 Visual Studio 11 编译时错误
【发布时间】:2012-05-15 01:45:22
【问题描述】:

以下代码使用 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&lt;&gt; troll。插入效果很好,程序可以编译。但是,一旦我尝试auto z = x[1] -> 因此尝试获取1 映射到的数组巨魔,程序不会编译并出现以下错误:

error C2512: 'std::array&lt;_Ty,_Size&gt;::array':没有合适的默认构造函数可用

是什么导致了 gcc 和 vs11 之间的这种行为差异以及如何解决它?

谢谢。

【问题讨论】:

  • 你确定pairus 不应该是make_pair 吗? (但不要认为这是你的问题)
  • 是的,它工作得很好,pairus 是 std::pair 类型。这种奇怪的编译器行为让我发疯了。
  • pairus 是什么样的(假设它是一个自定义函数?或者它是 MSVC++ 的 make_pair 的别名?)。我怀疑问题可能出在 pairus 上,因为您发布的代码中的任何地方都不需要默认构造函数。 (虽然如果您在地图中没有 k 的情况下执行 x[k],则需要默认 ctor。)
  • @Corbin:他在自己的代码中定义了pairus,高于main。
  • 你试过auto z(x[1]);吗?

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


【解决方案1】:

您的类型不可赋值,因为它包含常量。

x[1] 尝试返回可分配的引用。如果它还不存在,它还将为键构造一个空值。这两个都对您的类型无效。您必须改用 find。

【讨论】:

  • 为什么 gcc 会编译这个东西 :) ?
  • 该标准只说明了什么是必需的,它没有说明什么是允许的。 gcc 实现工作的某种方式在您的特殊情况下不会导致相同的问题。这样做是免费的。这里没有诊断要求。
【解决方案2】:

改用auto z = *x.find(1);[]-operator 需要默认可构造类型。事实上,整个容器都需要一个默认可构造的类型,所以当你尝试各种实现时,除了随机运气之外,你真的别无所求。

【讨论】:

  • 你是个天才! :) 有效! :) Gcc 似乎知道一些神秘的魔法。谢谢;)
  • 不确定默认构造函数要求是否代表整个容器,因为 C++11 已通过。新地图需要能够容纳可移动类型,但只有部分功能可供它们使用。我不认为 [] 运算符不是。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
相关资源
最近更新 更多