`std :: pair`` second` tiene un tipo incompleto con el árbol `unordered_map`

Estaba revisando un código mío antiguo y vi el código usando punteros para implementar un árbol deVariant objetos. Es un árbol porque cadaVariant puede contener ununordered_map deVariant*.

Miré el código y me pregunté por qué no se trata solo de usar valores, unstd::vector<Variant>ystd::unordered_map<std::string, Variant>, en vez deVariant*.

Así que seguí adelante y lo cambié. Parecía estar bien, excepto una cosa, tengoerrores:

/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
        ^~~~~~~

Así que pensé que podría engañar al compilador para que retrase la necesidad de conocer ese tipo, quetampoco funcionó.

Trabajando ¡No funciona! (MCVE)

Pensé que esto funcionaba antes, pero en realidad no funciona, lo olvidé::type sobre elusing 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;
}

Entonces, mi pregunta es, ¿por qué funciona bien paravector y nounordered_map?

Si el problema es la incapacidad de usar tipos incompletos, ¿hay alguna manera de retrasar la creación de instancias deunordered_map? Realmente no quiero que cada propiedad de objeto sea separadanew asignación.

Respuestas a la pregunta(1)

Su respuesta a la pregunta