2016-07-04 56 views
0

此代码编译失败:圆形类型定义

class B; 
class A{ 
    typedef int AThing; 
    typedef B::BThing BThing; 
}; 
class B{ 
    typedef int BThing; 
    typedef A::Athing AThing; 
}; 

由于A需要从B一个typedefB需要一个从A

使用具有循环依赖关系的typedefs的典型方法是什么?

+1

不是重复的IMO,这里没有头文件,更不用说头文件中的循环依赖包括 –

+0

不知道为什么我不能回答,所以会在这里做。这绝对不是重复,而且确实很难!这种情况可以通过添加一个间接级别来解决:[见demo](https://godbolt.org/g/jx5IC9)。我遇到了相同的情况,现在我正在寻找更通用和更有用的解决方案。 – Trollliar

+0

@Trollliar这是一个有趣的方式来解决这个问题.. – DarthRubik

回答

2

具有这种类型的圆形typedef相关性的典型解决方案是不具有这种类型的圆形typedef相关性。这些类型的圆形typedef依赖无法在C++来完成,所以你必须重新安排你的类层次结构:

class B; 

typedef int this_is_a_BThing; 

class A{ 
    typedef int AThing; 
    typedef this_is_a_Bthing BThing; 
}; 
class B{ 
    typedef this_is_a_BThing BThing; 
    typedef A::Athing AThing; 
}; 
+0

这太臭了......哦,很好 – DarthRubik

0

什么是使用具有循环依赖关系的类型定义的典型方法是什么?

有没有这样的典型的方法,你不能这样做。

有关如何使用前向声明并展开类型范围内的相关typedef的情况,请参阅Resolve header include circular dependencies in C++的答案。

在类范围中引入typedef的情况与编译器无法通过查看前向声明来解决它无关。


我能想到用类型定义的唯一方法是使用Pimpl Idion,实际上只执行他们介绍。

+0

这不是一个重复.....它是一个单独的问题完全 – DarthRubik