2013-07-20 116 views
3

下面是包含int dataNodePtr next的链接列表Node结构示例。对原始指针使用typedef与shared_ptr

我的想法是对NodePtr使用typedef,因为我想试验一个原始指针与一个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

+0

顺便说一句,一个'shared_ptr'是在所有的概率错误的智能指针在这里。你真的想共享所有权吗?鉴于结构,是不是'unique_ptr'更可能? –

+0

谢谢,是的,shared_ptr不是这个例子所需要的。 我只是试验如何用智能指针替换原始指针。 – user2602740

回答

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

感谢您的回复。我现在更了解它。 如果我在结构中移动'typedef',它将只在该范围内可见。但是因为我想让'NodePtr'在其他地方可见,所以我宁愿'typedef'在外面。 – user2602740

+0

@ user2602740您可以始终从外部执行'Node :: ptr'。 –

+0

当然可以。谢谢。 – user2602740