使用另一个 class 的 typedef 成员时出现 C++ 编译错误

C++ Compilation error when using typedef'ed members of another class

下面的代码有什么问题。 我收到编译错误。 我也尝试过 class B 的前向声明。但未能成功。

Test.cpp

#include <memory>
#include <iostream>

namespace api
{

class A
{
public: 
    typedef std::shared_ptr<A> APtr;
    APtr get_a_ptr();    
    B::BPtr get_b_ptr();
};

class B
{
public:    
    typedef std::shared_ptr<B> BPtr;
    BPtr get_b_ptr();
    A::APtr get_a_ptr();
};

}


int main(int argc, char **argv)
{
    return 0;
}

这样做:

namespace api
{
  class B; // forward declaration

  class A
  {
    public: 
      typedef std::shared_ptr<A> APtr;
      APtr get_a_ptr();    
      std::shared_ptr<B> get_b_ptr();
  };
  ...
}

问题是您正在向 class B 请求尚未定义的内容。所以使用 std::shared_ptr<B> 你会没事的。


更多信息,请阅读:When can I use a forward declaration?

您的代码中的问题是 B::BPtr 没有在 class 声明之前声明。你应该在使用它之前声明 BPtr 。例如:

class B;
class A;

typedef std::shared_ptr<B> BPtr;
typedef std::shared_ptr<A> APtr;


class A
{
public: 
    APtr get_a_ptr();    
    BPtr get_b_ptr();
};

class B
{
public:    
    BPtr get_b_ptr();
    APtr get_a_ptr();
};

请记住,在完整的 class 声明之前,您不能将 operator*operator->shared_ptr 一起使用。