Проблема возникает, когда я определяю структуру, подобную следующей
struct TInputData
{
QString filename;
QFile file;
QTextStream stream;
};
затем я помещаю это в контейнер QVector следующим образом:
QVector<struct TInputData> input(DATA_SOURCE_END);
после этого я вызываю некоторые методы полей-членов вектора:
for(int i = 0; i < DATA_SOURCE_END; ++i)
{
input[i].filename = QString(argv[i + 1]);
input[i].file.setFileName(input[i].filename);
if (!input[i].file.open(QIODevice::ReadOnly))
{
QDebug(QtCriticalMsg) << "Failed to open input file: " << input[i].filename << "!!!";
return a.exec();
}
input[i].stream.setDevice(&input[i].file);
qDebug() << "Connected to input file " << input[i].filename;
}
Я получаю следующую ошибку компиляции:
/usr/include/qt4/QtCore/qfile.h:209: error: 'QFile::QFile(const QFile&)' is private
within this context <at line where struct TInputData is declared>
И точно так же в отношении QTextStream.
Так чего мне не хватает?
Заранее спасибо за помощь.
ОБНОВИТЬ
Решение, предлагаемое @Ashot, заключается в создании объектов TInputData вручную. Но это вводит некоторые дополнительные трудности управления памятью. Обходной путь — использование умных указателей.
+ Изменить QVector<struct TInputData> input(DATA_SOURCE_END);
в QVector<TInputData*> input(DATA_SOURCE_END);
QVector
нужно копировать его содержимое, но копировать конструктор QFile
является частным, его нельзя скопировать.
При использовании указателей вы должны вручную создавать новые и удалять объекты TInputData или использовать для этого умные указатели.
Ты можешь попробовать QSharedPointer
http://qt-project.org/doc/qt-4.8/qsharedpointer.html#QSharedPointer-2.
Ваш вектор будет QVector<QSharedPointer<TInputData> > input(DATA_SOURCE_END)
Других решений пока нет …