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>`