ネストされた QVariantMap を使用していますが、パス (文字列リスト) を受け取り、低レベルの QVariantMap へのポインターを返すメソッドの定義に問題があります。
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 の内部への参照を取得できません。ネストされた QVariantMap への割り当ての投稿で提案されている data_ptr を使用しようとしましたが、運がありませんでした。明らかな理由から、挿入/削除/値に特別なラッパーを作成したくない(そのため、私が理解しているように、リンクされたトピックで受け入れられた回答は私の場合ではありません)。
私は試した:
- QVariant 内に QPointer を格納する - QVariant は QObject ではないため、うまくいきません。
- QVariant::fromValue( QVariantMap *) を使用してポインターを保存しますが、 toMap() を呼び出すと、ポインターではなく QVariantMap が返されるため、一時的なアドレスの取得エラーが再び発生しました。いずれにせよ、これが私が望んでいるものだとは思いません。
誰かがそれを適切に行うにはどうすればよいですか?