Разница работы QVector append и push_back

//Этим можно не забивать голову, в своей сути - Vector<T>
//Указанно полностью, для "общей картины" вопроса    
typedef QVector<QPair<QPair<QString,LexemType>, QVector<int>>> tokenType ; 
    QSet<QString> MainWindow::_brackets={"(",")","{","}","[","]","<",">"};
    tokenType tokens;
    QStringList tmp = str.split(" ");
    for (int var = 0; var < tmp.length(); ++var)
    {
      if (_brackets.contains(tmp.at(var))) {processBrackets(tmp.at(var));}
    }
    
    QVector<tokenType> MainWindow::processBrackets(const QString &inputStr)
    {
    static QVector<tokenType> foundTokens;
    .......
    return  foundTokens;
    
    }

Почему tokens.push_back(d.at(var)); - выдает:

mainwindow.cpp:54:24: error: no matching member function for call to 'push_back' qvector.h:272:17: note: candidate function not viable: no known conversion from 'const QVector<QPair<QPair<QString, LexemType>, QVector > >' to 'const QPair<QPair<QString, LexemType>,

QVector >' for 1st argument qvector.h:273:10: note: candidate function not viable: no known conversion from 'const QVector<QPair<QPair<QString, LexemType>, QVector > >' to 'QPair<QPair<QString, LexemType>, QVector >' for 1st argument

tokens.append(d.at(var)); - нет?

Хотя tokens.push_back(d.at(var)); - внутри устроен как void push_back(T &&t) { append(std::move(t))};

- ссылаясь на тот же inline void append(const QVector<T> &l) { *this += l; }


Ответы (1 шт):

Автор решения: Maxim Timakov

push_back может добавлять только один элемент, а append - копию вектора-аргумента.

Ругань компилятора

mainwindow.cpp:54:24: error: no matching member function for call to 'push_back' qvector.h:272:17: note: candidate function not viable: no known conversion from 'const QVector<QPair<QPair<QString, LexemType>, QVector > >' to 'const QPair<QPair<QString, LexemType>,

как раз на то, что Вы пытаетесь засунуть в push_back целый вектор, а не его элемент.

→ Ссылка