2011-10-23 146 views
0

我有以下的(截)類聲明:解引用成員指針錯誤:不能用作成員指針

template <typename T> 
class btree 
{ 
    public: 

     btree(const btree<T>& original); //This is btree's copy constructor 

    private: 

     struct btree_node 
     { 
      btree_node(const btree_node &other) 
      { 
       //This is node's copy constructor 
      } 
     } 

     btree_node* headNode; 
} 

而B樹的拷貝構造函數實現這種方式:

template <typename T> 
btree<T>::btree(const btree<T>& original) 
{ 
    headNode = new btree_node(original.*headNode); 
} 

original * headNode應該返回original.headNode指向的btree_node,從而與btree_node的拷貝構造函數參數匹配。

不過,我得到以下錯誤:

error: '((btree*)this)->btree::headNode' cannot be used as a member pointer, since it is of type 'btree::btree_node*'

我在做什麼錯?

回答

3

如果你看一下precedence table你會看到,首先.運營商進行評估,然後*(解引用)運算符被評估。

*需要一個指針作爲參數。如果你寫original.*headNode,這是沒有意義的。不知何故,你告訴它得到的*headNodeoriginal,但*headNode不是original的成員。你也告訴它評估*headNode這實際上是*this->headNode(請注意,首先評估->)。

你想要的是首先通過編寫original.headNode得到指針,然後使用*對其進行解引用。因此

*original.headNode 
+0

感謝一堆爲此,我現在明白了:) – Arvin

5

試試這個:

headNode = new btree_node(*(original.headNode)) 
+0

啊..當然,謝謝,那工作 – Arvin

2

我假設你想要的其實是

headNode = new btree_node(*original.headNode); 
+0

是的的確是我想要的東西!愚蠢的錯誤。謝謝!我認爲,如果我做* original.headNode那麼它會解引用原來這不是一個指針,因此沒有意義 – Arvin