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