如何解决这个循环包括?

时间:2012-02-17 19:38:29

标签: c++ templates typedef

我遇到过这种情况但无法解决,任何提示都会受到高度赞赏

//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

4 个答案:

答案 0 :(得分:3)

鸡蛋和鸡肉问题。 :)

注意Common.h中Node的声明

//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;
};

答案 1 :(得分:1)

只要您不以需要知道NodeSPtr大小的方式访问Node指针对象,您可能只是声明 Node in COMMON.H。

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

答案 2 :(得分:1)

使用前向声明和typename的组合。此外,包括警卫不会是错误的;)

Node.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

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

答案 3 :(得分:0)

我会:

//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;
};