Я просматривал свой старый код и увидел код, использующий указатели для реализации дерева из Variant
объектов. Это дерево, потому что каждый Variant
может содержать unordered_map
из Variant*
.
Я посмотрел на код и подумал, почему он не использует просто значения, std::vector<Variant>
и std::unordered_map<std::string, Variant>
вместо Variant*
.
Так что я пошел вперед и изменил его. Вроде все нормально, за исключением одного: я получил ошибки:
/usr/local/include/c++/6.1.0/bits/stl_pair.h:153:11: error: 'std::pair<_T1, _T2>::second' has incomplete type _T2 second; /// @c second is a copy of the second object ^~~~~~ main.cpp:11:8: note: forward declaration of 'struct Variant' struct Variant ^~~~~~~
Поэтому я решил, что могу обмануть компилятор, заставив его отложить необходимость знать этот тип, что не сработало. либо.
Работает Не работает! (MCVE)
Я думал, что раньше это работало, но на самом деле это не так, я забыл ::type
на using HideMap...
#include <vector>
#include <unordered_map>
#include <iostream>
template<typename K, typename V>
struct HideMap
{
using type = std::unordered_map<K, V>;
};
struct Variant
{
using array_container = std::vector<Variant>;
// Does not work either
using object_container = typename HideMap<std::string, Variant>::type;
// Fails
//using object_container = std::unordered_map<std::string, Variant>;
private:
union Union
{
std::int64_t vint;
array_container varr;
object_container vobj;
// These are required when there are union
// members that need construct/destruct
Union() {}
~Union() {}
};
Union data;
bool weak;
};
int main()
{
Variant v;
std::cout << "Works" << std::endl;
}
Итак, мой вопрос: почему это работает нормально для vector
, а не для unordered_map
?
Если проблема заключается в невозможности использования неполных типов, есть ли способ отложить создание экземпляра unordered_map
? Я действительно не хочу, чтобы каждое свойство объекта было отдельным выделением new
.
HideMap
делает не то, что вы думаете. - person T.C.   schedule 14.05.2016Variant
, чтобы попытаться создать экземпляр карты после завершения типаVariant
, но это тоже не сработало. - person doug65536   schedule 14.05.2016