Отладчик VS2008 C ++ кажется неспособным / не желающим просматривать экземпляры структур, определенных внутри функции, когда эти экземпляры (или ссылки на них) объявляются в области, отличной от той, в которой определена вложенная структура (например, цикл for). Есть идеи, почему это так?
void MyClass::doSomething()
{
struct NestedStruct
{
int usefulMetaInfo
vector<double> data;
};
//WORKS - Debugger can see inside ns
NestedStruct ns;
ns.data.push_back(1);
//FAILS - Debugger cannot see inside ns
for{int i=0;i<1;i++}
{
NestedStruct ns;
ns.data.push_back(1);
}
}
Такие структуры имеют внутреннюю связь, и почти наверняка у отладчика возникнут проблемы с его просмотром по той же причине, по которой запрещено использовать их в качестве параметров типа шаблона.
Ваше единственное решение здесь может заключаться в том, чтобы поместить структуру, например, в детальное пространство имен, чтобы дать ей внешнюю связь.
Обойти эту проблему достаточно просто.
Просто убедитесь, что все дескрипторы NestedStruct объявлены в той же области, что и определение NestedStruct. Обратите внимание, что для этого часто может потребоваться использование указателей, а не ссылок (например, когда вы хотите перебрать контейнер NestedStruct).
void MyClass::doSomething()
{
struct NestedStruct
{
int usefulMetaInfo
vector<double> data;
};
NestedStruct ns*; //declare here
for{int i=0;i<1;i++}
{
//NestedStruct ns*; //DON'T declare here
ns = someContainer[i];
ns->data.push_back(1);
}
}
Это позволит вам аккуратно инкапсулировать структуру, в которой она находится (подробности реализации), и в то же время иметь возможность проверять ее с помощью отладчика VS2008. Вы отдаете немного контроля над областью, но это лучшее из доступных зол.
Почему отладчик имеет эту проблему, я не знаю …