`std :: pair`` second` tem tipo incompleto com a árvore `unordered_map`
Eu estava revisando um código antigo e vi o código usando ponteiros para implementar uma árvore deVariant
objetos. É uma árvore porque cadaVariant
pode conter umunordered_map
doVariant*
.
Eu olhei para o código e me perguntei por que não está apenas usando valores, umstd::vector<Variant>
estd::unordered_map<std::string, Variant>
, ao invés deVariant*
.
Então eu fui em frente e mudei. Parecia tudo bem, exceto uma coisa, eu conseguierros:
/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
^~~~~~~
Então achei que poderia enganar o compilador para atrasar a necessidade de conhecer esse tipo, quetambém não funcionou.
Trabalhando Não está funcionando! (MCVE)Eu pensei que isso funcionava mais cedo, mas na verdade não, eu esqueci::type
nousing 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;
}
Então, minha pergunta é: por que funciona bem paravector
e nãounordered_map
?
Se o problema for a incapacidade de usar tipos incompletos, existe uma maneira de atrasar a instanciação dounordered_map
? Eu realmente não quero que cada propriedade de objeto seja separadanew
alocação.