我目前正在处理类型模板的节点,当我将这些节点与普通类的数据进行比较时,我遇到了一个问题。不匹配的2种数据类型是root->data = item;
root
行Node<string> *TreeParser::root
,其中item
是const Node <string> &
。在查看以前的工作时,两个类都是类型模板,这是有效的。但是,当我将类更改为非模板类型时,此代码不再起作用。如何将这两种不同类型的数据相互通信而不将类更改为类型模板。这是我的示例代码:
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
}
答案 0 :(得分:2)
getContext()
此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
是item
。
所以,总结一下:
Node<string>
尝试将root->data = item;
分配给Node<String>
。
那当然不会起作用。可以分配给string
的唯一内容是另一个std::string
,或std::string
,或许或其他一些在此不重要的事情。
你的意图是:
const char *
但是,任何你可以找到其他地方root->data = item.data;
的地方都可以在这里同样运作。
答案 1 :(得分:1)
在您的代码中root->data
是string
而item
是Node<string>
引用。这些显然是不兼容的类型。如果您真的想避免模板TreeParser
,则应使用Node
的复制或移动构造函数来创建root
。类似于:root = new Node<string>(item);
哦,是的,放弃通常的评论,使用unique_ptr
或shared_ptr
而不是裸指针。