2012-01-08 13 views
3

私のコードは、コードは私にではなく、私のコンパイラに大丈夫に見えるこのここでtypeof()を正しく使用していませんか?

#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: In function ‘int main()’:

code.cpp:95:9: error: specialization of ‘std::vector::iterator’ after instantiation

code.cpp:95:9: error: expected primary-expression before ‘typeof’

code.cpp:95:9: error: expected ‘;’ before ‘typeof’

code.cpp:95:9: error: name lookup of ‘j’ changed for ISO ‘for’ scoping

code.cpp:95:9: note: (if you use ‘-fpermissive’ G++ will accept your code)

code.cpp:95:9: error: no match for ‘operator!=’ in ‘j != numbers.std::vector<_Tp, _Alloc>::end with _Tp = long int, _Alloc = std::allocator, std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer = long int*’

私はここで何が欠けていますか?

+0

これは、すべての地獄のように悪です。 – Puppy

+1

@DeadMG、私はマクロに対する一般的な感情を理解しています。しかし、この場合の実際の問題は何ですか? 'c'が複数回評価されるという事実に関連するリスクとは別に、そして 'typeof'の非移植性。 –

+0

typeofキーワードは何ですか?最初に見て.. – codekiddy

答えて

7

マクロに括弧がありません。

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

修正してどのようなエラーが発生するのかを確認してください。

マイナーノート1:反復するときには、i++の代わりに++iを使用すると、イテレータの方が高速になることがよくあります。

マイナーノート2:typeofは、GCC固有の拡張です。あなたのコードは他のコンパイラではコンパイルされません。

私はあなたが欠けていると思う
+1

はい。かっこと中カッコがないと、コンパイラが目的とはまったく異なる方法でコードを解析するため、非常に混乱しやすいエラーが発生することがあります。私たちが生きなければならないもの:-) –

+1

@PeterAlexander:単純なコードを使用してください: 'for(n:numbers){/*...*/}' –

+0

'auto'または' C++ 11ではなくdecltype((c).begin()) 'を使用します。 –

4

「)」を

#define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++) 
関連する問題