C ++ - 比较模板和类之间的数据类型

时间:2017-08-01 01:51:32

标签: c++ templates nodes

我目前正在处理类型模板的节点,当我将这些节点与普通类的数据进行比较时,我遇到了一个问题。不匹配的2种数据类型是root->data = item; rootNode<string> *TreeParser::root,其中itemconst 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
}

2 个答案:

答案 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->datastringitemNode<string>引用。这些显然是不兼容的类型。如果您真的想避免模板TreeParser,则应使用Node的复制或移动构造函数来创建root。类似于:root = new Node<string>(item);

哦,是的,放弃通常的评论,使用unique_ptrshared_ptr而不是裸指针。