2010-07-23 5 views
0
//Constructing set of all Places in Conflict with each other 
int l_placeVec, l_placeVec1,p; 
for(SP_ListListNode::const_iterator iter = m_postTransitionsSet.begin(),l_placeVec=0; iter != m_postTransitionsSet.end(); iter++,l_placeVec++) { 
    for(SP_ListListNode::const_iterator inneriter = m_postTransitionsSet.begin(),l_placeVec1=0; inneriter != m_postTransitionsSet.end(); inneriter++,l_placeVec1++) { 
     if((iter != inneriter) && ((**inneriter) == (**iter)) && (((int)((*iter)->size()))>1)) { //when the two lists are same 
      SP_ListNode* temper = new SP_ListNode; 
      temper->clear(); 
      for(SP_ListNode::const_iterator iterplaces = m_placeNodes->begin(),p=0; iterplaces != m_placeNodes->end(); iterplaces++,p++) { 
       if((p == l_placeVec) || (p == l_placeVec1)) { 
        temper->push_back(*iterplaces); 
       } 
      } 
      m_conflictingPlaces.push_back(temper); 
     } 
    } 
} 

Приведенный выше код говорит: «Неиспользованная переменная p», хотя я использую ее в третьем цикле. В случае, если необходима дополнительная информация, оставьте комментарий.C++ переменная область ошибки внутри внутри цикла

Но это нечто странное, с которым я столкнулся.

+3

Возможно, вы захотите разбить это на функции по меньшей мере ... – GManNickG

+1

Если у вас есть совместимый с C++ 0x компилятор, подумайте об использовании ключевого слова auto, чтобы сделать инициализаторы цикла немного легче читать: http://en.wikipedia.org/wiki/C++0x#Type_inference – kwatford

ответ

4

Вы указали совершенно другую переменную p во внутреннем цикле. Здесь

for(SP_ListNode::const_iterator iterplaces = m_placeNodes->begin(),p=0; ... 

выше эквивалентно объявлению

SP_ListNode::const_iterator p = 0 

, который, конечно, скрывающую внешнее p. Внешний p остается неиспользованным, о чем предупреждает компилятор.

По случайному совпадению, этот внутренний p является initializable с 0 и сравнима с int, даже если его тип SP_ListNode::const_iterator, поэтому нет никаких ошибок сообщается, когда вы делаете это. Но это просто совпадение.

P.S. Просто заметили, что вы сделали то же самое с всеми этими внешними int переменными, что объясняет, почему сравнения, такие как p == l_placeVec, не терпят неудачу.

+0

Если я делаю это так int p; for (SP_ListNode :: const_iterator iterplaces = m_placeNodes-> begin(), p = 0; ... ... ... еще тогда p скрыто. является ли выход? –

+0

@Gaurav: вы инициализируете его до 'for'. * Конечно * перемещение' p' не изменяет результат, первый оператор в for-loop является объявлением, независимо от того, что-то вне цикла. Этот первый оператор, как есть, всегда будет создавать новую переменную с именем 'p', теперь и навсегда. – GManNickG

+0

@Gaurav Kalra: Stop redeclaring' p'. Либо сделайте 'p = 0' * до * цикла , или объявить 'SP_ListNode :: const_iterator iterplaces' перед циклом. В последнем случае цикл будет выглядеть следующим образом:' for (iterplaces = m_placeNodes-> begin(), p = 0; ... '. – AnT

0

"SP_ListNode :: const_iterator iterplaces = m_placeNodes-> begin(), p = 0;" создает новый p типа SP_ListNode :: const_iterator ... поэтому внешний p не используется.

Смежные вопросы