C ++循环依赖于在类/结构内定义的公共别名(typdef / using)

时间:2017-01-04 07:21:39

标签: c++ include using circular-dependency

有没有办法打破循环依赖,如下所示,而不在类外移动using/typedef个别名?

// header A.h
#ifdef A
#define A
#include "B.h"
class A {
  using ID = uint32_t;
  void some_func(B::ID id);
};
#endif A


// header B.h
#ifdef B
#define B
#include "A.h"
class B {
  using ID = uint64_t;
  void some_func(A::ID id);
};
#endif B


// main.cpp
#include "A.h"
int main() {...}

假设保护#ifdef存在且ID可以是更复杂的类型(struct等。)。

编辑:稍微澄清一下:别名不一定相同(即不是ID)。

修改示例:

// header A.h
#ifdef A
#define A
#include "B.h"
class A {
  using SomeAliasInA = uint32_t;
  void some_func(B::SomeAliasInB id);
};
#endif A


// header B.h
#ifdef B
#define B
#include "A.h"
class B {
  using SomeAliasInB = std::string;
  void some_func(A::SomeAliasInA id);
};
#endif B

1 个答案:

答案 0 :(得分:0)

为类型定义创建外部文件:

template<typename T>
struct types{};

class A;
class B;

template<>
struct types<A>{
    using alias = std::string;
};

template<>
struct types<B>{
    using ID = bool;
    using alias_2 = int;
    using alias_3 = short;
};

然后您可以这样使用它:

class A{
    void foo(types<B>::ID id);
};
class B{
    void foo(types<A>::alias id);
};