не могу понять причину ошибки no matching function for call to 'QCommandLineOption::QCommandLineOption()'

я пытаюсь хранить все параметры командной строки в QMap , а потом обработать их примерно следующим образом :

const QMap<QString, QCommandLineOption> outputOptions = {
        {"filename" , QCommandLineOption(QStringList() << "f" << "file name", "vector file 
        name", "file")}};

    parseCmdLn.setApplicationDescription("myApp");
    parseCmdLn.addHelpOption();
    parseCmdLn.addVersionOption();  
    for (auto i = outputOptions.begin(); i != outputOptions.end(); i++)
        parseCmdLn.addOption(i.value());
    parseCmdLn.process(QCoreApplication::arguments());
    QString outputFile = parseCmdLn.value(outputOptions["filename"]);

ошибка возникает в последней строке. Но я не понимаю зачем мне там вызов конструктора ведь конструктор отработал при определении outputOptions .


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

Автор решения: Bearded Beaver

QMap::operator[] ведет себя следующим образом - сначала проверяется, существует ли значение по ключу, если нет, вставляется дефолтно сконструированное значение, и далее возвращается ссылка:

T &operator[](const Key &key)
{
    const auto copy = d.isShared() ? *this : QMap();
    detach();
    auto i = d->m.find(key);
    if (i == d->m.end())
        i = d->m.insert({key, T()}).first;  // туть
    return i->second;
}

Чтобы дефолтный конструктор не вызывался, предлагаю заменить QMap на std::map, а значение получать через outputOptions.at("filename"). Если ключ не найден, этот метод кидает исключение. В QMap я не нашел методов с таким поведением.

→ Ссылка