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