c++ - 如何打破这种循环类型定义?

标签 c++ stl iterator typedef forward-declaration

我想声明几个类型 (在 KV 上模板化并提供一些缓存行为的类内部):

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++ - 如何打破这种循环类型定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4169641/

相关文章:

c++ - 从其参数之一找到 vector 中的元素

c++ - 双端队列中指针的自定义比较器

c++ - 使用 C++11/14 正确定义 DLL 接口(interface)

c++ - 为什么当我向作为 std::mem_fun() 参数的成员函数添加引用参数时编译错误?

Scala函数错误: type mismatch

c++ - 为什么这个来自模板类型 "stack"类的 isEmpty() 没有继承到 C++ 中模板类型的派生类 "specialStack"?

c++ - 什么比 std::pow 更快?

c++ - 在 darwin 上静态 boost 包括 libstdc++?

c++ - 删除双端队列 C++ 中的多个元素

java - 具有降序和升序的迭代器不起作用