Я пишу класс для записи данных синхронизации из файлов в буферы. Буфер здесь представляет собой вектор векторов. в файле заголовка, когда я пытался
private:
QVector<QVector<int>> m_buffer(10); // I want to have an array of 10 vectors.
Не удалось скомпилировать с ошибкой:
error: expected identifier before numeric constant
QVector<QVector<int>> m_buffer(10);
^~
и та же ошибка для функции, когда я пытался в заголовке:
public:
void getDataFromFiles(QList<QString> audioFilesList, QVector<QVector<int> > buffer(10));
Но он компилируется, когда я просто сохраняю void getDataFromFiles(QList<QString> audioFilesList, QVector<QVector<int> > buffer);
для функции, но в этом случае буферы вводятся не так, как я хочу, я обнаружил, что данные одинаковы для всех 10 векторов.
заголовок:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void getDataFromFiles(QList<QString> audioFilesList, QVector<QVector<int> > buffer);
private:
Ui::MainWindow *ui;
// QVector<QVector<int>> buffer(10); // this does not compile
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QList<QString> audioFilesList;
audioFilesList.append("/path/to/file1");
audioFilesList.append("/path/to/file2");
QVector<QVector<int>> buffer(10);
getDataFromFiles(audioFilesList, buffer); // I think there is a way to pass buffer(10) instead?
}
void MainWindow::getDataFromFiles(QList<QString> audioFilesList, QVector<QVector<int> > buffer)
{
// ...
// to fill buffer I use
buffer[i].append(value);
// ...
}
Как насчет std:array <QVector <int>, 10> m_buffer;
?
Также работают брекеты: QVector <QVector <int>> m_buffer {10};
, см.: wandbox.org/permlink/8DatCNS9ZJm7DMaE
@MarekR, ты имеешь в виду в конструкторе сделать что-то подобное for(int i = 0 ; i < 10 ; i++) { m_buffer[i] = new QVector<int> ; }
@PaulSanders да, это опасно только для вектора целочисленных типов. Тем не менее, я думаю, что рекомендуется использовать списки инициализаторов членов конструктора.
@MarekR Да, наверное, ты прав
Инициализировать, если С++ 11 или выше:
QVector<QVector<int>> m_buffer=QVector<QVector<int>>(10);
Или в конструкторе класса m_buffer:
QVector<QVector<int>> m_buffer;
Constructor(): m_buffer(10){}
Лучшее предположение об этой ошибке заключается в том, что компилятор обрабатывает m_buffer
как функцию с типом возвращаемого значения QVector<QVector<int>>
, как упоминал @Marek R.
Вы не можете инициализировать поля в объявлении поля с помощью круглых скобок (поскольку это похоже на объявление функции-члена). Переместите инициализацию
m_buffer
в списки инициализаторов членов конструктора. Обратите внимание, что версия фигурной скобки будет делать что-то еще (один элемент со значением 10).