2013-02-07 89 views
0

我有一個鏈接列表類列表。我必須爲它製作複製構造函數。我實際上遇到了語法問題。這裏是我的代碼:鏈接列表類的複製構造函數

template <class T> 
List<T>::List(const List<T>& otherList) 
{ 
} 

otherList是另一種類型的List。事實上,我認爲這是一個指向List的指針。我有一個爲類List定義的getHead()函數,它的工作正常。 我想執行以下操作將確定:

Node* temp = otherList->getHead(); 

節點是的名單是由指針。這是一個獨立的類節點。 但做上述給出了錯誤:

base operand of -> has non-pointer type const List<int> 

,所以我試圖用「」而不是上面表達式中的「 - >」。得到了以下錯誤:

passing const List<int> as this argument of ListItem<T>* List<T>::getHead() [with T = int] discards qualifiers [-fpermissive] 

我getHead功能:

template <class T> 
node<T>* List<T>::getHead() 
{ 
return head; 
} 

親切指導我

+1

是什麼讓你認爲它是一個指針? –

+0

外來列表引用是const。因此您只能使用它的const成員,並且您從中檢索的數據成員都是相同的。 – WhozCraig

回答

2

首先,otherList不是指針,它是一個 「參考const List<T>」。我們知道這是一個參考,因爲它的類型爲&。如果它是一個指針,它的類型將有一個*。引用的行爲與您剛剛擁有對象本身的行爲完全相同。因此使用.訪問其成員函數getHead是正確的。

現在的問題是您有const引用,但您正在調用非const成員函數。就編譯器而言,您的getHead函數可能會修改List,因此不應在const List上調用。您需要聲明getHeadconst。無論你有getHead聲明,開頭的函數{前貼const

template <typename T> 
const Node<T>* List<T>::getHead() const { 
    // ... 
} 

這假定getHead實際上並沒有修改列表(它不應該)。如果確實如此,則無法將其設置爲const成員函數,因爲otherListconst,所以無法從複製構造函數調用它。但是,您的拷貝構造函數不應該修改它正在拷貝的對象,所以您的otherList應該const

+0

我做了你指出的事情。但我得到了相同的錯誤: –

+0

傳遞常量列表作爲ListItem的這個參數* List :: getHead()[與T = int]丟棄限定符[-fpermissive] –

+0

+1,對不起,兔子,這可能應該是'const List :: Node *',但是沒有來自OP的代碼,很難說。假設'Node'是一個嵌套的'List '類,這是正確的。否則你有什麼。 – WhozCraig

0

我覺得getHead()應該被聲明爲一個const函數......試試吧,讓我們知道它是否有效。