2011-07-21 13 views
4
vector<string> MyStrings; 
vector<string>::iterator ItStr; 

私はc_str()を使用して、文字列へのポインタを返します。文字列ベクトル反復子の逆参照にかっこが必要なのはなぜですか?

なぜかっこで逆参照する必要がありますか?

はコンパイルされません:*ItStr.c_str();

エラーC2039: 'c_str':のメンバーではない 'のstd ::ベクトル< _Ty> ::イテレータ'

をコンパイル/と連携しますイテレータの周りの括弧:(*ItStr).c_str();

正しい方向に私を指すことができれば(私はそれを感謝します)ありがとう!

+5

';:

はを見てください_brackets_は通常 '['と ']'を参照します(そして '{'と '}'は通常_moustaches_; err、私は_braces_を意味します)。 –

+0

は「かっこ」で質問を修正しました –

答えて

12

.は単項より高い優先度を持ちます*

*ItStr.c_str()は、*(ItStr.c_str())と同じです。

あなたは、もちろん、ただ(*x).y以来、ItStr->c_str()を使用することができますが、少なくとも、ポインタとイテレータのためのx->y(と同等であり、あなたは、もちろん、あなたが、彼らは一貫性がないように、あなた自身のタイプの演算子をオーバーロードすることができますが、それをするのは夢中だ)。

+1

厳密に言えば、あなたは「{}」をヒマラヤと呼んでいたので答えを選びました。 –

2

括弧なしでは、文全体を逆参照しようとしていますItStr.c_str()

*ItStrの略語を使用すると、ItStrを参照解除してから、.c_str()のメンバーを取得します。逆参照されたItStrのまわりにかっこを置く代わりに、矢印演算子->を使用することもできます。

James他が指摘したように、これは演算子の優先順位の問題です。

5

.演算子が*演算子よりも優先されるためです。

*(ItStr.c_str()); 
明らかに間違っている

、あなたはおそらく意図していなかった:括弧なしでthis link

4

を参照してください、*ItStr.c_str();は次のように解釈されます。その解釈は、.演算子が*演算子よりも優先順位が高いためです。ここで角括弧を使用する必要があるのを避けるには:

(*ItStr).c_str(); 

これを解釈するには、正しく解釈できるようにします。`通常_parentheses_と呼ばれている(`と `)

関連する問題