vector<string> MyStrings;
vector<string>::iterator ItStr;
我正在使用c_str()返回指向字符串的指针。
为什么需要用括号取消引用?
不编译:{{1}}
错误C2039:'c_str':不是'std :: vector&lt; _Ty&gt; :: iterator'
的成员
使用迭代器周围的括号编译/使用:*ItStr.c_str();
如果你能指出我(没有双关语),我会很感激。谢谢!
答案 0 :(得分:12)
.
的优先级高于一元*
。
*ItStr.c_str()
就好像你曾说过*(ItStr.c_str())
。
当然,您可以使用ItStr->c_str()
,因为(*x).y
等同于x->y
(至少对于指针和迭代器;当然,您可以为您的运算符重载他们自己的类型不一致,但你这样做会很疯狂。)
答案 1 :(得分:5)
因为.
运算符优先于*
运算符。见this link
答案 2 :(得分:4)
没有括号,*ItStr.c_str();
被解释为:
*(ItStr.c_str());
这显然是错误的,你可能并不打算这样做。它以这种方式解释,因为.
运算符的优先级高于*
运算符。为避免这种情况,您需要在此处使用括号:
(*ItStr).c_str();
这样就可以正确解释它 - 你打算如何解释它。
看看:
答案 3 :(得分:2)
如果没有括号,您试图取消引用整个语句ItStr.c_str()
。
对于*ItStr
周围的问题,您将取消引用ItStr
,然后转移.c_str()
成员。也可以使用箭头操作符->
代替将括号括在解除引用的ItStr
周围。
正如詹姆斯等人指出的那样,这是一个运营商优先问题。