如何转发声明属于类的模板化类型?

Mik*_*hke 10 c++ templates forward-declaration

假设我有2个班:

class A
{
public:
  typedef std::shared_ptr<A> Ref;
  ...

private:
  B::Ref _b;
}

class B
{
public:
  typedef std::shared_ptr<B> Ref;
  ...

private:
  A::Ref _a;
}
Run Code Online (Sandbox Code Playgroud)

这显然需要B类和B :: Ref的前向声明.前向声明B很简单,但如何对B :: Ref也这样做?

P0W*_*P0W 8

解决这个问题的方法之一是

class A;
class B ;

template <typename T>
struct Traits {
    typedef std::shared_ptr<T>  Ptr; 
};


class A
{
    private:
      Traits<B>::Ptr _b;
};

class B
{
    private:
      Traits<A>::Ptr _a;
};
Run Code Online (Sandbox Code Playgroud)


101*_*010 4

您不能向前声明嵌套,typedef因为在向前声明时B将是不完整的类型。但是,您可以像下面这样解决您的问题:

class B;

class A {
  std::shared_ptr<B> _b;
public:
  typedef std::shared_ptr<A> Ref;
};

class B {
  A::Ref _a;
public:
  typedef std::shared_ptr<B> Ref;
};
Run Code Online (Sandbox Code Playgroud)