Вы не можете использовать typedef
в объявлении переменной.
Вам также не нужно использовать typename
, так как вы не определяете тип, который зависит от другоготип, указанный в параметре шаблона.
Вы просто пытаетесь объявить переменную существующего типа, поэтому просто используйте этот тип как есть, например:
// use a const_iterator to avoid detach-ing the list while iterating...
QLinkedList<T>::const_iterator iter = TList->cbegin();
Или, если вы используете C ++ 11 или более позднюю версию, вы можете упростить это до следующего:
auto iter = TList->cbegin();
В любом случае вы получаете ошибку «не объявлено в этой области», потому что вы неУ вас есть пара скобок в вашем if
блоке:
if(!TList->isEmpty())
{ // <-- add this!
// set iterator
QLinkedList<T>::const_iterator iter = TList->cbegin();
// or: auto iter = TList->cbegin();
while(iter != TList->cend()) {
textStream << iter->getDataInCSV();
++iter; //move iterator to next
}
} // <-- add this!
Без дополнительных скобок ваш исходный код функционально идентичен следующему:
if(!TList->isEmpty()) {
// set iterator
QLinkedList<T>::iterator iter = TList->begin();
}
while(iter != TList->end()) { // <--- iter is not in scope here!
textStream << iter->getDataInCSV();
++iter; //move iterator to next
}
Как видите,Цикл while
не находится в теле оператора if
, поэтому переменная iter
действительно не находится в области видимости для цикла while
.
Если вы используете C ++ 11 или новее, рассмотрите вариант использования loop-based for
loop , основанного на ранжировании, тогда вам вообще не придется иметь дело с итератором:
// write each information to the textstream/file
for (const T &item : qAsConst(*TList)) {
textStream << item.getDataInCSV();
}
Или:
// write each information to the textstream/file
for (const auto &item : qAsConst(*TList)) {
textStream << item.getDataInCSV();
}
В качестве альтернативы вы можете использовать собственное расширение foreach
Qt:
// write each information to the textstream/file
foreach (const T &item, *TList)
textStream << item.getDataInCSV();
В дополнение к этому, контейнеры Qtреализовать семантику копирования при записи с помощью подсчета ссылок, чтобы их было очень эффективно передавать по значению, вам не нужно передавать их по указателю, например:
void DataManager::saveObject(QLinkedList<T> TList)
Хотя я, вероятно, мог бывместо этого использовалась ссылка const
, так как это предпочтительный способ передачи объекта, который вы не собираетесь изменять:
void DataManager::saveObject(const QLinkedList<T> &TList)