【问题标题】:C++ - Comparing data types between templates and classesC++ - 比较模板和类之间的数据类型
【发布时间】:2018-01-07 17:26:09
【问题描述】:

我目前正在使用模板类型的节点,当我将这些节点与普通类的数据进行比较时遇到了问题。不匹配的 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
}

【问题讨论】:

    标签: c++ templates nodes


    【解决方案1】:
    root->data = item;
    

    这个root是一个指向Node&lt;string&gt;的指针

    root = new Node<string>();
    

    那么,小测验时间:root-&gt;data 是什么。正确答案当然是std::string。模板参数是std::string,所以用模板声明:

    T data;
    

    T 是前面提到的std::string,我们在此声明中得出结论:

    root->data = item;
    

    root-&gt;data 部分是std::string。现在要讨论的下一个项目是这里的item 到底是什么,它被声明为:

    const Node<string>& item
    

    因此,您的itemNode&lt;string&gt;

    所以,总结一下:

    root->data = item;
    

    尝试将Node&lt;String&gt; 分配给string

    这当然行不通。唯一可以分配给std::string 的可能是另一个std::stringconst char *,或者其他一些在这里不重要的东西。

    您可能的意图是:

    root->data = item.data;
    

    但是,您可以找到其他std::string 的任何地方都可以在这里使用。

    【讨论】:

    • 谢谢你的回复,当你这样经历时,这很有意义。
    【解决方案2】:

    在您的代码中,root-&gt;datastring,而 itemNode&lt;string&gt; 引用。这些显然是不兼容的类型。如果您真的想避免模板化TreeParser,您应该使用Node 的复制或移动构造函数来创建root。比如:root = new Node&lt;string&gt;(item);

    哦,是的,要放弃通常的注释,请使用unique_ptrshared_ptr 而不是裸指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2018-11-02
      • 2020-07-20
      • 2018-01-26
      相关资源
      最近更新 更多