2010-11-26 58 views
1

BOOST_FOREACH使位于GroupMember类中的成员weak_ptr无效,请帮助我理解原因。在BOOST_FOREACH循环内设置的变量在循环外无效,为什么?

下面的代码说明错误:

class GroupMember 
{ 
    bool logInState; 
    boost::weak_ptr<CUser> wpUser; 
}; 

GroupMember::iterator it; 

BOOST_FOREACH(EachLevel aLevel, levels) 
{ 
    if(aLevel.exist(spUser)) 
    { 
    it = aLevel.getIteratorToGroupMember(spUser); 
    //iterator (it) is valid as well as the group member's attributes (and weak_ptr) 
    } 
} 

//Iterator (it) seems to be valid but the weak_ptr is invalid. 
//The counter to the object is more than 10 so the weak ptr is not expired. 

下面的代码工作完美:

GroupMember::iterator it; 
std::vector<EachLevel>::iterator itLevel; 
for(itLevel = levels.begin(); itLevel != levels.end(); ++itLevel) 
{ 
    if(itLevel->exist(spUser)) 
     it = itLevel->getIteratorToGroupMember(spUser); 
} 

//Here is iterator (it) valid (including the weak_ptr) 

我看不出差别,你能吗?

谢谢!

回答

3

您认为BOOST_FOREACH在您的第二个代码片段中执行,这是错误的假设。

其次,在您的BOOST_FOREACH中,按值重复。请参考:

BOOST_FOREACH(EachLevel& aLevel, levels) 

并查看它是否有效。

3

EachLevel aLevel创建一个本地对象aLevel,其范围仅限于BOOST_FOREACH。如果从这个对象中取出iterator,它将在循环外部无效。您可以通过声明EachLevel& aLevel将其更改为参考,以便不创建副本并且您的迭代器保持有效。在第二种情况下,您直接访问对象而不创建任何副本,因此它可以工作。

+0

啊,我明白了!它与增加的参考一起工作。 – user521048 2010-11-26 08:44:50

相关问题