`std :: pair`` second` hat einen unvollständigen Typ mit `unordered_map` tree

Ich habe einige ältere Codes von mir durchgesehen und festgestellt, dass der Code Zeiger verwendet, um einen Baum von @ zu implementiereVariant Objekte. Es ist ein Baum, weil jedesVariant kann ein @ enthaltunordered_map vonVariant*.

Ich habe mir den Code angesehen und mich gefragt, warum nicht einfach nur Werte verwendet werden, einstd::vector<Variant>, undstd::unordered_map<std::string, Variant>, Anstatt vonVariant*.

So ging ich voran und änderte es. Es schien in Ordnung, bis auf eine Sache, ich bekam fehler:

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

So dachte ich, ich könnte den Compiler dazu bringen, die Notwendigkeit zu verzögern, diesen Typ zu kennen, der hat auch nicht funktioniert.

Arbeite Funktioniert nicht! MCVE)

Ich dachte, das hat früher funktioniert, aber es funktioniert nicht, ich habe vergessen::type auf derusing 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;
}

Also, meine Frage ist, warum funktioniert es in Ordnung fürvector und nichtunordered_map?

Wenn das Problem in der Unfähigkeit besteht, unvollständige Typen zu verwenden, gibt es eine Möglichkeit, die Instanziierung des @ zu verzögerunordered_map? Ich möchte wirklich nicht, dass jede Objekteigenschaft ein separates @ isnew Zuordnung.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage