2013-07-20 98 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