以下是包含Node
和int data
的链接列表NodePtr next
结构的示例。
我的想法是为typedef
使用NodePtr
,因为我想尝试使用原始指针和shared_ptr。另外,为了简单起见,我希望能够只更改一行,从一个到另一个。
使用原始指针,以下代码编译得很好。
typedef struct Node* NodePtr;
struct Node {
int data;
NodePtr next;
};
但是,如果我只是将typedef更改为shared_ptr,则会出现编译错误。
typedef std::shared_ptr<Node> NodePtr;
struct Node {
int data;
NodePtr next;
};
error: ‘Node’ was not declared in this scope
error: template argument 1 is invalid
我可以通过发表Node
的前瞻声明来解决这个问题。但是,Node
的双重定义对我来说有点难看。
struct Node;
typedef std::shared_ptr<Node> NodePtr;
struct Node {
int data;
NodePtr next;
};
那么,为什么第一个typedef
工作正常但第二个不工作?
并且,如果不使用前瞻性声明,typedef shared_ptr
是否可能?{/ p>
答案 0 :(得分:4)
那么,为什么第一个
typedef
工作正常但第二个不工作?
因为您的第一个typedef
转发声明Node
:
typedef struct Node* NodePtr;
// ^^^^^^^^^^^
您可以在第二个typedef
中执行相同操作:
typedef std::shared_ptr<struct Node> NodePtr;
如果你想避免它,请在结构中声明typedef :
struct Node {
typedef Node* ptr; // no need for `struct`!
// or `typedef std::shared_ptr<Node> ptr;`
int data;
ptr next;
};
此外,由于这是C ++ 11,您可以使用using
代替typedef
:
using ptr = Node*; // vs. `using ptr = std::shared_ptr<Node>`