Почему разыменование строкового векторного итератора требует скобок? - PullRequest
4 голосов
/ 21 июля 2011
vector<string> MyStrings;
vector<string>::iterator ItStr;

Я использую c_str () , чтобы вернуть указатель на строку.

Почему нужно разыменовывать в скобках?

Не компилируется: *ItStr.c_str();

ошибка C2039: 'c_str': не является членом 'std :: vector <_Ty> :: iterator'

Компилирует / Работает с круглыми скобками вокруг итератора: (*ItStr).c_str();

Если бы вы могли указать мне (не каламбур) в правильном направлении, я был бы признателен. Спасибо!

Ответы [ 4 ]

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

. имеет более высокий приоритет, чем унарный *.

*ItStr.c_str(), как если бы вы сказали *(ItStr.c_str()).

Вы, конечно, можете просто использовать ItStr->c_str(), поскольку (*x).y эквивалентно x->y (по крайней мере, для указателей и итераторов; вы, конечно, можете перегружать операторы для своих собственных типов, так что они не согласуется, но вы бы с ума сошли)

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

Поскольку оператор . имеет приоритет над оператором *.Смотрите эту ссылку

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

Без скобок *ItStr.c_str(); интерпретируется как:

*(ItStr.c_str());

что, очевидно, неправильно, и что вы, возможно, не собирались. Это интерпретируется так, потому что оператор . имеет более высокий приоритет, чем оператор *. Чтобы избежать этого, вам нужно использовать скобки здесь:

(*ItStr).c_str();

Чтобы его можно было правильно интерпретировать - так, как вы намереваетесь его интерпретировать.

Взгляните на:

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

Без скобок вы пытаетесь разыменовать весь оператор ItStr.c_str().

С паренсом около *ItStr вы разыменовываете ItStr и затем берете его .c_str().Оператор со стрелкой -> может также использоваться вместо скобок вокруг разыменованного ItStr.

Как указали Джеймс и др., Это проблема приоритета оператора.

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