2017-08-01 61 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而不是裸指针。