Я не правильно использую typeof () здесь? - PullRequest
3 голосов
/ 08 января 2012

Мой код выглядит так

#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++)

...

typedef vector<long> vl;
vl numbers;

...

tr(numbers, j) { // this is line 95
    ...
}

Код выглядит хорошо для меня, но не для моего компилятора! Мне безжалостно выдаются следующие ошибки:

code.cpp: в функции int main ():

code.cpp: 95: 9: ошибка: специализация ‘std :: vector :: iterator ’после создания

code.cpp: 95: 9: ошибка: ожидаемое первичное выражение до «typeof»

code.cpp: 95: 9: ошибка: ожидается ‘;’ перед "typeof"

code.cpp: 95: 9: ошибка: поиск имени «j» изменен для ISO «для» области видимости

code.cpp: 95: 9: note: (если вы используете «-fpermissive», G ++ примет ваше код)

code.cpp: 95: 9: ошибка: нет совпадения для оператора =!! В ‘j! = numbers.std :: vector <_Tp, _Alloc> :: заканчивается _Tp = long int, _Alloc = std :: allocator, std :: vector <_Tp, _Alloc> :: iterator = __gnu_cxx :: __ normal_iterator>, имя типа std :: _ Vector_base <_Tp, _Alloc> :: _ Tp_alloc_type :: pointer = long int * ’

Что мне здесь не хватает?

Ответы [ 2 ]

7 голосов
/ 08 января 2012

В макросе отсутствует скобка.

#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++)
                                      ^
                                 Need ) here

Попробуйте исправить это и посмотрите, какие ошибки вы получите.

Небольшое примечание 1: при итерации используйте ++i вместо i++, так как первое часто может быть быстрее для итераторов.

Незначительное примечание 2: typeof является специфическим расширением GCC. Ваш код не будет компилироваться на других компиляторах.

4 голосов
/ 08 января 2012

Я думаю, вам не хватает ')'

#define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
...