`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.