Не удается инициализировать unordered_map из int - PullRequest
0 голосов
/ 21 июля 2011

У меня действительно странная проблема.MSVC не имеет списков инициализаторов, поэтому я использовал лямбду для их аппроксимации.

static const std::unordered_map<std::wstring, LexedFile::Token> reserved_words = 
    []() -> std::unordered_map<std::wstring, LexedFile::Token> {
    std::unordered_map<std::wstring, LexedFile::Token> retval;
    // Do stuff with retval
    return retval;
}();

MSVC выдает ошибку компилятора.

error C2440: 'initializing' : cannot convert from 'int' to 
'std::tr1::unordered_map<_Kty,_Ty>'

Если я не слепой,нет "int" где-нибудь рядом с этим.Я не вижу, что не так.Любые предложения?

Редактировать:

В // Do stuff with retval нет ничего прикольного, это просто набор вставок, и это статическая переменная области видимости функции в лямбда-выражении в функции-члене.

auto next = [&] {
    static const std::unordered_map<std::wstring, LexedFile::Token> reserved_words = 
    []() -> std::unordered_map<std::wstring, LexedFile::Token> {
        std::unordered_map<std::wstring, LexedFile::Token> retval;
        retval[L"namespace"] = LexedFile::Token::Namespace;
        retval[L"for"] = LexedFile::Token::For;
        retval[L"while"] = LexedFile::Token::While;
        retval[L"do"] = LexedFile::Token::Do;
        retval[L"switch"] = LexedFile::Token::Switch;
        retval[L"case"] = LexedFile::Token::Case;
        retval[L"default"] = LexedFile::Token::Default;
        retval[L"try"] = LexedFile::Token::Try;
        retval[L"catch"] = LexedFile::Token::Catch;
        retval[L"auto"] = LexedFile::Token::Auto;
        retval[L"type"] = LexedFile::Token::Type;
        retval[L"break"] = LexedFile::Token::Break;
        retval[L"continue"] = LexedFile::Token::Continue;
        retval[L"return"] = LexedFile::Token::Return;
        retval[L"static"] = LexedFile::Token::Static;
        retval[L"sizeof"] = LexedFile::Token::Sizeof;
        retval[L"decltype"] = LexedFile::Token::Decltype;
        retval[L"if"] = LexedFile::Token::If;
        retval[L"else"] = LexedFile::Token::Else;
        return retval;
    }();
    if (stack.empty())
        return;
    std::wstring token(stack.begin(), stack.end());
    stack.clear();
    if (reserved_words.find(token) != reserved_words.end()) {
        l.tokens.push_back(reserved_words.find(token)->second);
        return;
    }
    l.tokens.push_back(LexedFile::Identifier);
};

Компилятор примет его, если я использую конструктор напрямую, а не инициализацию, что кажется очень странным.Вероятно, ошибка компилятора.

1 Ответ

0 голосов
/ 21 июля 2011

Вызов конструктора с помощью () вместо использования = работает нормально, поэтому я отмечаю его как ошибку компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...