7

我正在尝试编译从这里获取的代码

// constructing unordered_maps
#include <iostream>
#include <string>
#include <unordered_map>

typedef std::unordered_map<std::string,std::string> stringmap;

stringmap merge (stringmap a,stringmap b) {
  stringmap temp(a); temp.insert(b.begin(),b.end()); return temp;
}

int main ()
{
  stringmap first;                              // empty
  stringmap second ( {{"apple","red"},{"lemon","yellow"}} );       // init list
  stringmap third ( {{"orange","orange"},{"strawberry","red"}} );  // init list
  stringmap fourth (second);                    // copy
  stringmap fifth (merge(third,fourth));        // move
  stringmap sixth (fifth.begin(),fifth.end());  // range

  std::cout << "sixth contains:";
  for (auto& x: sixth) std::cout << " " << x.first << ":" << x.second;
  std::cout << std::endl;

  return 0;
}

使用 MSVC2012 但我收到

错误 C2143:语法错误:在 '{' 之前缺少 ')'

在代码行上

stringmap second ( {{"apple","red"},{"lemon","yellow"}} );       // init list

我错过了什么吗?

4

3 回答 3

6

Visual Studio 2012 缺少许多现代 C++ 功能,其中包括initialiser lists. 有关概述,请参见此处。

于 2013-04-02T14:08:14.680 回答
4

您的代码没有任何问题,并且可以使用 GCC 和 Clang 正常编译。问题在于 Visual C++。

初始化程序列表是Visual Studio 2012 Update 2中将提供的功能之一。这意味着您目前无法在 Visual Studio 2012 中使用此功能。有一系列社区技术预览 (CTP),但它们带有一些小问题,包括缺乏 IntelliSense 支持和非常明确的免责声明,即它们不适合用于生产代码。

所以,简而言之:您的代码是正确的,但在 Microsoft 发布 Visual Studio 2012 Update 2 之前它不会在 VS2012 中编译。不知道什么时候会到来,但 Visual Studio 2012 于 2012 年 8 月首次发布,也是最后一次更新(更新 1)于 2012 年 11 月发布。从那时起,关于该主题的消息很少,但自去年年底以来一直“即将推出”。

立即更新更新 2已发布。但是,它不包括更新 2 CTP 中承诺的任何C++ 改进。这很有趣,因为它们应该是更新 2 中的预览。显然,Visual C++ 团队“目前正在完成这些功能的发布计划”并且“将很快分享更多细节”。(来自更新 2 发布公告的评论。)

于 2013-04-02T14:58:35.723 回答
2

更准确地说,初始化器列表在 VS2012 CTP 中具有特色,但该更新尚未发布,并且不包含对标准库中的初始化器列表的支持——IOW,它们已经接近,但微软还没有完全完成它们然而。

于 2013-04-02T14:37:54.633 回答