我遇到过这种情况但无法解决,任何提示都会受到高度赞赏
//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
答案 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;
};