2015-04-25 79 views
1

我有節點*電流在那裏我存儲一個指針在列表的「頂部」當前哪個節點。當我設置一個新的節點作爲目前我得到的錯誤:「=」:無法從「CircularDoubleDirectedList <int> ::節點*」轉換爲「節點*」

'=' : cannot convert from 'CircularDoubleDirectedList<int>::Node *' to 'Node *' 
while compiling class template member function 'void CircularDoubleDirectedList<int>::addAtCurrent(const T &)' with [ T=int ] 

它是三排//產生這些錯誤的問題發表評論,如果把他們帶走一切工作正常。

#include "ICircularDoubleDirectedList.h" 

template <typename T> class CircularDoubleDirectedList; 
class Node; 

template <typename T> 
class CircularDoubleDirectedList : 
    public ICircularDoubleDirectedList<T>{ 
public: 
    //Variables 
    Node* current; 
    int nrOfElements; 
    direction currentDirection; 

    //Functions 
    CircularDoubleDirectedList(); 
    ~CircularDoubleDirectedList(); 
    void addAtCurrent(const T& element) override; 

private: 
    class Node 
    { 
    public: 
     T data; 
     Node* forward; 
     Node* backward; 

     Node(const T& element); 
    }; 

}; 
template <typename T> 
void CircularDoubleDirectedList<T>::addAtCurrent(const T& element){ 
    Node* newNode = new Node(element); 
    newNode->data = element; 
    if (this->nrOfElements == 0){ 
     newNode->forward = newNode; 
     newNode->backward = newNode; 
    } 
    else{ 
     this->current->forward = newNode; // Problem 
     this->current->forward->backward = newNode; // Problem 
    } 
    this->current = newNode; //Problem 
} 
+0

你不需要你在使用它之前宣佈的私人'Node'類公共界面?你確定首先要把'current'作爲一個公共成員變量嗎?事實上,所有的成員變量都應該是私人的,不是嗎?有人使用類擺弄物品的數量,或設置'current'到節點在不同的列表,或...否則濫用你的模板類你不想。 –

+0

我哈德宣佈它,我只是錯過了我的代碼的頂部。是的,他們肯定他們應該是私人的。我只想讓這個工作擺在首位。 – Olof

+0

您的代碼有一些微不足道的錯誤(如Node的向前聲明),修正當編譯代碼。請參閱[演示](http://ideone.com/qmRCEN) – Abhijit

回答

3

當你向前聲明Node爲這裏的課堂外:

template <typename T> class CircularDoubleDirectedList; 
class Node; 

即宣佈在全局命名空間類型Node。它是::Node。然後,你的類聲明中,current承擔類型:

template <typename T> 
class CircularDoubleDirectedList 
    : public ICircularDoubleDirectedList<T> 
{ 
public: 
    Node* current; // this is a pointer to ::Node. 
}; 

然後你提供的CircularDoubleDirectedList<T>::Node聲明。這是同一類型::Node。它也會首先按名稱解析規則查找。所以在這裏:

template <typename T> 
void CircularDoubleDirectedList<T>::addAtCurrent(const T& element){ 
    Node* newNode = new Node(element); // newNode is a pointer to 
             // CircularDoubleDirectedList<T>::Node 

current是一個指針仍然不完全類型::Node。因此,錯誤 - 你在不經意間創造類型的命名Node

如果你要前瞻性聲明Node,你必須這樣做類:

template <typename T> 
class CircularDoubleDirectedList 
    : public ICircularDoubleDirectedList<T> 
{ 
    class Node; // NOW it's CircularDoubleDirectedList<T>::Node 
}; 
+0

我有class Node;宣佈我只是錯過了我所說的最重要的部分。然而,我把它放在我的列表類之前的頂部,我應該把它放在類裏面嗎? – Olof

+0

@Olof:不顯示產生錯誤的代碼的近似值。顯示一個MCVE([Minimal,Complete,Verifiable Example](http://stackoverflow.com/help/mcve))或SSCCE([Short,Self-Contained,Correct Example](http://sscce.org/)) - 同一個基本思想的兩個名稱和鏈接 - 完全再現您想要分析的錯誤。如果您不顯示代碼,我們無法可靠地告訴您代碼中出現了什麼問題;充其量,我們可以猜測。 –

+0

@Olof現在你發佈了一個完整的問題,我可以給你一個更好的答案。 – Barry