C++ 使用带有原始指针的typedef与共享\u ptr
下面是一个链表C++ 使用带有原始指针的typedef与共享\u ptr,c++,typedef,shared-ptr,C++,Typedef,Shared Ptr,下面是一个链表Node结构的示例,其中包含int data和NodePtr next 我的想法是对NodePtr使用typedef,因为我想用原始指针和共享的ptr进行实验。此外,为了保持简单,我希望能够将一行代码从一行更改为另一行 对于原始指针,下面的代码编译得很好 typedef struct Node* NodePtr; struct Node { int data; NodePtr next; }; 但是,如果我只是将typedef更改为共享的ptr,就会出现编译错误 ty
Node
结构的示例,其中包含int data
和NodePtr next
我的想法是对NodePtr
使用typedef
,因为我想用原始指针和共享的ptr进行实验。此外,为了保持简单,我希望能够将一行代码从一行更改为另一行
对于原始指针,下面的代码编译得很好
typedef struct Node* NodePtr;
struct Node {
int data;
NodePtr next;
};
但是,如果我只是将typedef更改为共享的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
那么,为什么第一个typedef
可以正常工作,而第二个不行呢?
并且,是否可以在不使用转发声明的情况下typedef shared_ptr
s
那么,为什么第一个typedef
可以正常工作,而第二个不行呢
因为您的第一个typedef
转发声明节点
:
typedef struct Node* NodePtr;
// ^^^^^^^^^^^
您可以在第二个typedef
中执行相同的操作:
typedef std::shared_ptr<struct Node> NodePtr;
using ptr = Node*; // vs. `using ptr = std::shared_ptr<Node>`
顺便说一句,
shared\u ptr
很可能是错误的智能指针。你真的想要共享所有权吗?鉴于结构,是否更可能是唯一的\u ptr
呢?谢谢,是的,本例不需要共享的\u ptr。我只是在尝试如何用智能指针替换原始指针。谢谢您的回复。我现在更明白了。如果我在结构内部移动typedef
,它将仅在该范围内可见。但是因为我希望NodePtr
在其他地方可见,所以我更希望typedef
在外部。@user2602740您总是可以从外部执行Node::ptr
。
struct Node {
typedef Node* ptr; // no need for `struct`!
// or `typedef std::shared_ptr<Node> ptr;`
int data;
ptr next;
};
using ptr = Node*; // vs. `using ptr = std::shared_ptr<Node>`