如何打破这个循环typedef?

tim*_*day 7 c++ iterator stl typedef forward-declaration

我要声明几个类型的(内部的类的模板上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;
Run Code Online (Sandbox Code Playgroud)

当然,由于循环定义,这是不可能的.我可以用它来破解它void*,但我想知道是否有一些前向声明魔法或其他技术可以更好地完成工作.

(是的,我知道boost::bimap有人会回避这个问题).

Pet*_*der 7

这是不可能的,考虑类型是什么:

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 ...
Run Code Online (Sandbox Code Playgroud)

这不是前向声明的问题,您可以简单地尝试描述在其自身上递归定义的类型.它没有什么不同:

struct A { B b; };
struct B { A a; };
Run Code Online (Sandbox Code Playgroud)

解决这个问题的唯一方法是丢失一些静态类型信息.正如您所说,您可以使用void*,或者您可以尝试定义自己的抽象类型擦除接口.你的选择.

  • 迭代器不一定是指针.它们可以是,通常是类.彼得的分析是正确的. (2认同)