模板类中的循环依赖

时间:2016-07-27 19:51:10

标签: c++ templates circular-dependency

我在使用类型的循环引用时遇到问题。对于以下内容:

// Parent.h
template <typename OtherType>
class EnclosingType
{
public:
    typename OtherType type_;
};

class OtherType
{
public:
    EnclosingType & e_;
    OtherType (EnclosingType & e) : e_(e) {}
};

要求是OtherType接受EnclosingType对象的引用,以便它可以调用EnclosingType上的方法,EnclosingType可以调用OtherType上的方法。主要目标是允许实现者提供他们自己的OtherType派生类型。

处理这种类型的循环依赖存在的情况的最佳方法是什么? OtherType的正确声明是什么? OtherType :: EnclosingType的正确声明是什么? Enclosing :: OtherType :: type_的正确声明是什么?我甚至需要做什么?

感谢。

1 个答案:

答案 0 :(得分:1)

如果我假设您希望OtherType包含对EnclosingType<OtherType>的引用,您可以执行以下操作:

// EnclosingType declaration
template <typename T>
class EnclosingType;

// OtherType definition
class OtherType
{
public:
  EnclosingType<OtherType> & e_;
  OtherType (EnclosingType<OtherType> & e) : e_(e) {}
};

// EnclosingType definition
template <typename T>
class EnclosingType
{
public:
    T type_;
};

您可以在EnclosingType中使用OtherType声明(而不是定义),因为您通过指针或引用引用它。 EnclosingType<OtherType>的定义需要OtherType的定义,因为它按值包含它。