Forward declarations work only for pointers and references. Depending which compiler you using, the "map_value" is an incomplete type at the point where you declared it inside the struct map_value body. I beleive it probably should be:
struct map_value;
struct map_value {
std::unordered_map<std::string,std::unique_ptr<map_value*>> value;
};