2013-04-02 2 views
6

Я пытаюсь скомпилировать the code taken from hereunordered_map - {{ключ, значение}, {ключ, значение}} Синтаксис недействителен

// 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 

Я что-то упустил?

+0

работает для gcc: https://ideone.com/qkOUMN – moooeeeep

ответ

5

В Visual Studio 2012 отсутствуют многие современные возможности C++, среди которых initialiser lists. См. here.

+0

Это не совсем правильно. – Puppy

+3

Тем не менее, пока это правда. Я не сказал, что в последнее время не будет –

2

Чтобы быть более точными, списки инициализаторов представлены в CTP VS2012, но это обновление еще не опубликовано и не содержит поддержки списков инициализаторов в стандартной библиотеке - IOW, они близки, но Microsoft haven ' Пока они еще не закончили.

4

В коде нет ничего плохого, и он отлично компилируется с помощью GCC и Clang. Проблема связана с Visual C++.

Списки инициализаторов являются одной из функций, которые будут доступны в Visual Studio 2012 Обновление 2. Это означает, что вы не можете использовать эту функцию в Visual Studio 2012. Существует серия из Community Tech Previews (CTP), но у них есть некоторые незначительные проблемы, в том числе отсутствие поддержки IntelliSense и очень четкие заявления об отказе от ответственности, в которых говорится, что они не предназначены для использования в производственном коде.

Итак, вкратце: ваш код верен, но он не будет скомпилирован в VS2012 до тех пор, пока Microsoft не выпустит обновление Visual Studio 2012 2. Нет никакой информации, когда это произойдет, но Visual Studio 2012 был впервые выпущен в августе 2012 года и последнее обновление (обновление 1) было выпущено в ноябре 2012 года. С тех пор новостей было мало, но это было «скоро» с конца прошлого года.

Обновление Теперь, Update 2 было выпущено. Тем не менее, он не включает любые обещанных улучшений C++ из CTP Update 2. Это смешно, учитывая, что они должны быть предварительными просмотрами того, что должно появиться в обновлении 2. По-видимому, команда Visual C++ - это «в настоящее время завершает планы релиза для этих функций» и «скоро расскажет подробнее» , (из комментариев по Update 2 release announcement.)

+0

, как травы, так и stephan t. lavavej были довольно спокойны на своем блоге/канале 9, что может указывать на предстоящий выпуск – TemplateRex

+0

@rhalbersma Надеюсь, вы правы. Это было бы прекрасно. – Agentlien

+0

Надеюсь, что так тоже, но меня очень раздражает расписание MS. И у них все еще есть псевдонимы шаблонов, = delete/= default, noexcept, constexpr и другие лакомства для покрытия. – TemplateRex

Смежные вопросы