не могу понять причину ошибки 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 шт):
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
я не нашел методов с таким поведением.