2014-02-10 46 views
0

因此,對於一個項目,我使用帶有頭部和尾部指針的鏈表實現了一個列表類型作爲模板類。當我構建列表我用下面的代碼錯誤:沒有匹配的構造函數用於初始化'列表<double> ::節點'

template <class Item> 
List<Item>::List() 
{ 
     if (typeid(Item) == typeid(string)) 
     { 
       head = new node("0", NULL, NULL); 
       tail = new node("0", NULL, NULL); 
     } 
     else 
     { 
       head = new node(0, NULL, NULL); 
       tail = new node(0, NULL, NULL); 
     } 
     head->next = tail; 
     tail->prev = head; 
     cursor = head; 

     size = 0; 
} 

的typeid的if語句是存在的,因此如果我做字符串列表中的節點構造將獲得適當的字符串值,編譯器不會拋出一個合適的。這工作正常,但是當我編輯我的代碼,以便它也會初始化一個雙打列表編譯器拋出此錯誤:

/List.h:59:21:錯誤:沒有匹配的構造函數的初始化'列表: :節點' head =新節點(「0」,NULL,NULL);

據我可以告訴編譯器忽略我已放置的if語句,但我不知道爲什麼。如果我刪除了允許字符串的代碼,並且只使用else塊中的語句,那麼雙精度,整數,字符等工作正常,但然後字符串將無法工作。我已經驗證了if語句爲什麼類型的Item返回了正確的值,所以我很難理解編譯器爲什麼不喜歡這個。

我很確定有更好的方法可以做到這一點,但任何人都可以提供解決方案來解決這段特定的代碼?任何答案表示讚賞。

+0

您可以調用Item的構造函數作爲Item()來初始化節點對象。 head = new node(Item(),NULL,NULL) – sajas

+1

爲什麼你需要將字符串初始化爲'「0」'? –

回答

0

您可以調用模板參數的構造函數以在工作板上工作時初始化對象。你不需要typeid。 你可以只寫

head = new node(Item(), NULL, NULL); 
tail = new node(Item(), NULL, NULL); 

只有你的是,你所使用的類型必須有一個默認的構造函數來照顧,它必須是可複製

有了這個你的字符串將是事原始化爲空字符串

+0

工作,謝謝一堆。 –

相關問題