`std :: pair`` second` имеет неполный тип с деревом `unordered_map`

Я просматривал мой старый код и видел код, использующий указатели для реализации дерева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 распределение.

Ответы на вопрос(1)

Ваш ответ на вопрос