Вложенный QVariantMap

Я использую вложенный QVariantMap и у меня проблема с определением метода, который принимает путь (список строк) и возвращает указатель на QVariantMaps низкого уровня:

QVariantMap * getQVariantMap( QStringList spec) const {
    QVariantMap * deep_p = this->hash_p;

    for( QStringList::const_iterator it = spec.begin();
                                     it!= spec.end();
                                   ++it)
    {
        QVariantMap::const_iterator i = hash_p->find( *it);
        if( i == hash_p->end())
            return 0x00;

        res_p = & i.value().toMap();
    }

    return res_p;
}

...

QVariantMap map, level1, level2;
level2["L2"] = "bazzinga!";

level1["L1"] = QVariant::fromValue( level2);
level1["foo"] = "foo";

map["L0"] = QVariant::fromValue( level1);
map["foo"] = "foo";

QStringList qsl;
            qsl.append( "L1");
            qsl.append( "L0");

QVariantMap * qvm = getQVariantMap( qsl);//pointer to level2 part of the nested QVariantMap.

qvm[ "foo"] = "baz";

//map[ "L0"].toMap()[ "L1"].toMap()[ "foo"] == "baz";

...

Я получил следующую ошибку:

taking address of temporary [-fpermissive]

и я знаю почему. Проблема в том, что мне нужно получить указатель на часть вложенной структуры, но я не могу получить ссылку на внутренности QVariant. Я попытался использовать data_ptr, предложенный в сообщении Назначение вложенному QVariantMap, но безуспешно. По очевидным причинам я не хочу делать специальные обертки для вставки/удаления/значения (поэтому, как я понял, принятый ответ в связанной теме не мой случай).

Я старался:

  • хранить QPointer внутри QVariant -- безуспешно, потому что QVariant не является QObject;
  • для хранения указателя с помощью QVariant::fromValue(QVariantMap *), но когда я вызываю toMap(), он возвращает QVariantMap, а не указатель, поэтому я снова получил адрес временной ошибки. И в любом случае, я не думаю, что это то, чего я хочу.

Как кто-то должен сделать это правильно?


person Valentin T.    schedule 10.07.2014    source источник
comment
Почему вы храните свой QVariantMap как указатель? Почему не нравится значение?   -  person vahancho    schedule 10.07.2014
comment
Я сохраняю его как QVariant, полученный с помощью QVariant::fromValue(QVariantMap).   -  person Valentin T.    schedule 10.07.2014
comment
Ну, чем бы я написал это как res_p = new QVariantMap(i.value().toMap());   -  person vahancho    schedule 10.07.2014
comment
Вы не должны использовать new в QVariant и QVariantMap или использовать тип QVariant*. Они должны передаваться по значению.   -  person Pavel Strakhov    schedule 11.07.2014
comment
@vahancho, я думал, что получу указатель на клон карты, используя new, я ошибаюсь?   -  person Valentin T.    schedule 11.07.2014
comment
@ValentinT., вы получаете указатель на временную копию карты - вот откуда возникает ошибка. Вам нужно создать новый объект с new с помощью конструктора копирования.   -  person vahancho    schedule 11.07.2014
comment
Но в этом случае, если я изменю его, он не будет распространять изменения.   -  person Valentin T.    schedule 11.07.2014