2017-08-01 63 views
1

我目前正在處理類型模板的節點,當我將這些節點與普通類中的數據進行比較時,我遇到了問題。不匹配的兩種數據類型是線路root->data = item;rootNode<string> *TreeParser::root,其中itemconst Node <string> &。當查看以前的工作,其中兩個類都是類型模板時,這是有效的。但是,當我將類更改爲非模板類​​型時,此代碼不再有效。我怎樣才能讓這兩種不同類型的數據互相交流,而無需將我的課程改爲鍵入模板。這裏是我的示例代碼:C++ - 比較模板和類之間的數據類型

template <typename T> 
struct Node { 
    T data; 
    Node* lLink; 
    Node* rLink; 
}; 

class TreeParser{ 
public: 
    void insert(const Node<string>& item); 
private: 
    Node<string>* root{ nullptr }; 
}; 

void TreeParser::insert(const Node<string>& item){ 
    if (root == nullptr){ 
     root = new Node<string>(); 
     root->data = item; 
     return; 
    } 
    else 
    //do something 
} 

回答

2
root->data = item; 

root是一個指向Node<string>

root = new Node<string>(); 

所以,突擊測驗時間:什麼是root->data。當然,正確的答案是std::string。模板參數是std::string,使之與模板聲明:

T data; 

隨着T是上述std::string,我們也得出結論,在此聲明:

root->data = item; 

root->data部分是std::string。現在討論的下一個項目是究竟是這裏的item,以及它被聲明爲:

const Node<string>& item 

所以,因此,您itemNode<string>

因此,簡言之:

root->data = item; 

嘗試一個Node<String>分配給string

那當然是不行的。唯一可以分配給std::string的是另一個std::stringconst char *,或者其他一些在這裏不重要的東西。

你有可能的意圖是:

root->data = item.data; 

但是,你可以找到一些其他的std::string將同樣出色的工作在這裏的任何地方。

+0

謝謝你的回覆,當你以這種方式瀏覽時,會有很大的意義。 –

1

在你的代碼root->datastringitemNode<string>參考。這些顯然是不兼容的類型。如果你真的想避免模板TreeParser你應該使用Node的副本或移動構造函數創建root。就像:root = new Node<string>(item);

哦,是的,並放棄通常的評論,使用unique_ptrshared_ptr而不是裸指針。