我想声明几个类型
(在K
和V
模板化的类的内部,并提供一些缓存行为):
typedef std::map<
long long,
typename key_to_value_type::iterator // Ooops... not declared yet
> timestamp_to_key_type;
typedef std::map<
K,
std::pair<V,typename timestamp_to_key_type::iterator>
> key_to_value_type;
当然,由于存在循环定义,因此不可能如此。
我可以用
void*
破解它,但是我想知道是否存在一些前向声明魔术或其他技术可以更好地完成这项工作。(是的,我知道
boost::bimap
可以避开该问题)。 最佳答案
考虑一下类型是不可能的:
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*
,也可以尝试定义自己的抽象的,经过类型擦除的接口(interface)。你的选择。关于c++ - 如何打破这个圆形的typedef?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4169641/