3

Node这是一个包含 anint data和 a的链表结构的示例NodePtr next

我的想法是使用 a typedefNodePtr因为我想试验原始指针与 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不使用前向声明?

4

1 回答 1

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>`
于 2013-07-20T21:28:48.880 回答