2012-02-17 86 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