如何解决此循环include

How to resolve this cyclic include?

本文关键字:循环 include 解决 何解决      更新时间:2023-10-16

我遇到了这种情况,但无法解决,将非常感谢任何提示

//in file Common.h
#ifndef _COMMON_H_
#define _COMMON_H_
#include "Node.h"
template <typename T>
struct Ptr
{ 
     typedef std::tr1::shared_ptr< Node<T> >   NodeSPtr;
};
#endif
// in file Node.h
#ifndef _NODE_H_
#define _NODE_H_
#include "common.h"
template < typename T >
class Node
{
   T data; 
   Ptr<T>::NodeSPtr next;
};
#endif

鸡蛋和鸡肉的问题。:)

Common.h 中节点的注释声明

//in file Common.h
template <typename T>
class Node;
template <typename T>
struct Ptr
{ 
     typedef std::tr1::shared_ptr< Node<T> >   NodeSPtr;
};
// in file Node.h
#include "common.h"
template < typename T >
class Node
{
   T data; 
   Ptr<T>::NodeSPtr next;
};

使用正向声明和typename的组合。此外,包括警卫也不会有错;)

节点.h:

#ifndef Node_h
#define Node_h
template <typename T> struct Ptr;
template <typename T>
class Node {
   T data; 
   typename Ptr<T>::NodeSPtr next;
};
#endif

Common.h:

#ifndef Common_h
#define Common_h
#include <memory>
template <typename T> class Node;
template <typename T>
struct Ptr { 
    typedef std::shared_ptr< Node<T> > NodeSPtr;
};
#endif

现在,您可以按任何顺序多次包含这些标头。

只要您不以需要知道Node大小的方式访问NodeSPtr指针对象,您就可以在Common.h中声明Node

此外,可以说std::shared_ptr,而不是std::tr1::shared_ptr

我会:

//in file Common.h
#include "Node.h"
template <typename T>
struct Ptr
{ 
   typedef Node::NodeSPtr   NodeSPtr;
};
// in file Node.h
template < typename T >
class Node
{
   T data; 
   typedef std::tr1::shared_ptr< Node<T> >   NodeSPtr;
   NodeSPtr next;
};