Как решить этот циклический включить? - PullRequest
2 голосов
/ 17 февраля 2012

Я сталкивался с такой ситуацией, но не мог разрешить, любой совет был бы очень признателен

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

3 голосов
/ 17 февраля 2012

Проблема с яйцом и курицей.:)

Примечание объявление узла в 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;
};
1 голос
/ 17 февраля 2012

Используйте комбинацию предварительного объявления и 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

Теперь вы можете включать эти заголовки в любом порядке и несколько раз.

1 голос
/ 17 февраля 2012

Пока вы не обращаетесь к NodeSPtr pointee способом, который требует знания размера Node, вы можете просто объявить Node в Common.h.

Кроме того, можно сказать std::shared_ptr, а не std::tr1::shared_ptr.

0 голосов
/ 17 февраля 2012

Я бы:

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