C ++ 11 эксперименты, почему я не могу использовать некоторые функции? - PullRequest
6 голосов
/ 01 ноября 2011

В настоящее время я рассматриваю новые возможности C ++ 11 и по непонятным на данный момент причинам, некоторые из них не компилируются. Я использую gcc версии 4.6.0 20100703 (экспериментальная) (GCC), поэтому в соответствии с часто задаваемыми вопросами по GNU GCC все пробные функции поддерживаются . Я попытался скомпилировать флаги std = c ++ 0x и std = gnu ++ 0x.

Не член begin () & end ()

Например, я не хочу использовать не член begin () и end (), в таком фрагменте кода, как:

#include <iostream>
#include <map>
#include <utility>
#include <iterator>

using namespace std;
int main ( ) {
    map < string, string > alias;
    alias.insert ( pair < string, string > ( "ll", "ls -al" ) );
    // ... Other inserts

    auto it = begin(alias);
    while ( it != end(alias) ) {
        //...
    }

И я получаю,

nonMemberBeginEnd//main.cc:15:24: error: ‘begin’ was not declared in this scope
nonMemberBeginEnd//main.cc:15:24: error: unable to deduce ‘auto’ from ‘<expression error>’ // Ok, this one is normal.
nonMemberBeginEnd//main.cc:16:26: error: ‘end’ was not declared in this scope

Нужно ли включать специальные заголовки?

Для диапазона

Мой второй (и последний) вопрос страннее, поскольку он не может зависеть от скрытого заголовка черной магии, который я мог бы не включить.

Следующий код:

for ( auto kv : alias )
    cout << kv.first << " ~ " << kv.second << endl;

Дайте мне следующие ошибки:

rangeFor/main.cc:15:17: error: expected initializer before ‘:’ token

Надеюсь, мои вопросы не для вас неуместны или новички, ребята, и вы поможете мне выяснить, в чем дело: D

1 Ответ

5 голосов
/ 01 ноября 2011

Работает на gcc 4.6.1:

#include <iostream>
#include <map>
#include <string>

int main(int argc, char** argv) {
    std::map<std::string, std::string> alias = {{"key", "value"}};
    for (auto kv: alias)
        std::cout << kv.first << " ~ " << kv.second << std::endl;

    auto it = begin(alias);
    while (it != end(alias) ) {
        std::cout << (*it).first << " ~ " << (*it).second << std::endl;
        it++;
    }
    return EXIT_SUCCESS;
}

И результат:

# /opt/gcc-4.6.1/bin/g++-4.6 --std=c++0x test.cc -o test && ./test
key ~ value
key ~ value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...