Это невозможно, подумайте, какими будут типы:
timestamp_to_key_type
= map< long long, key_to_value_type::iterator >
= map< long long, map< K, pair< V, timestamp_to_key_type::iterator > >::iterator >
= map< long long, map< K, pair< V, map< long long, map< K, pair< V, map< long long, map< K, pair < V ...
Это не проблема с предварительными объявлениями, вы просто пытаетесь описать тип, который рекурсивно определен для самого себя.Он ничем не отличается от:
struct A { B b; };
struct B { A a; };
Единственный способ обойти это - потерять некоторую информацию статического типа.Как вы сказали, вы можете использовать void*
, или вы можете попытаться определить свой собственный абстрактный, стертый интерфейс.Ваш выбор.