1

次のような構造体を定義すると問題が発生します

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 オブジェクトを手動で作成することです。ただし、メモリ管理の問題がいくつか追加されます。回避策は、スマート ポインターを使用することです。

4

1 に答える 1

2

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)

于 2013-09-25T06:15:01.663 に答える