1
4

3 回答 3

5

int *map::iterator在这方面没有区别。int *与and一起使用的周围语义构造有所不同map::iterator,这就是为什么一个编译而另一个不编译的原因。

if可以选择

if (declaration)

或者

if (expression)

声明不是表达式。您不能将声明用作较大表达式中的子表达式。您不能将声明用作显式比较的一部分,这正是您尝试做的。

例如,如果你试图用 做同样的事情int *,像这样

if ((int* x = new int(123)) != NULL)

map::iterator代码无法编译的原因与您的代码无法编译的原因完全相同。

你必须使用

if (int* x = new int(123))

或者

int* x = new int(123);
if (x != NULL)

或者

int* x;
if ((x = new int(123)) != NULL)

正如您在上面看到的,int *表现出与map::iterator.

在您的示例中,不可能声明it并执行与props.end()in ifs 条件的比较。您将不得不使用上述变体之一,即

map<string, Property>::iterator it = props.find(PROP_NAME);
if (it != props.end())

或者

map<string, Property>::iterator it;
if ((it = props.find(PROP_NAME)) != props.end())

选择你更喜欢的。

PS当然,形式上也可以写

if (map<string, Property>::iterator it = props.find(PROP_NAME))

但它不会做你想做的事情(不将迭代器值与 进行比较props.end())并且可能根本无法编译,因为迭代器类型可能无法转换为bool.

于 2013-07-12T21:31:22.257 回答
1

这是将其限制在范围内的一种方法:

{
    auto it = props.find(PROP_NAME);
    if (it != props.end()) {
       it->do_something();
    }
}

当然,这个范围在技术上不是“if 范围”,但应该同样适用于所有实际意图和目的。

正如AndreyT 已经解释过的(+1),声明不能超越(and ),你没有使用它,int但你为迭代器做了。

于 2013-07-12T21:40:18.263 回答
0

映射迭代器包含firstsecond,它们分别指向键和值。要访问值的成员,请使用it->second.do_Something()

于 2013-07-12T21:32:38.717 回答