2012-02-17 158 views
2

我碰到这种情况,但未能解决,任何暗示将不胜感激如何解决这个循环包含?

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

回答

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 

现在,您可以按任何顺序和多次这些标题。

+0

它帮助...非常感谢 – 2012-02-17 23:01:03

+0

@AayushPoudel嗯......如果它有帮助,你应该接受它。或者,如果其他答案帮助更多,则应接受其他答案。无论如何,您应该对其他人帮助您的努力表示赞赏,通过加强(当您的声望达到15时)并接受有用的答案。 – 2012-02-20 14:13:27

3

一个鸡蛋和鸡的问题。 :)在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; 
}; 
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; 
}; 
1

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

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