将typedef与原始指针与shared_ptr一起使用

时间:2013-07-20 21:25:21

标签: c++ typedef shared-ptr

以下是包含Nodeint 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>

1 个答案:

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