【问题标题】:How to solve template conversion to an int如何解决模板转换为int
【发布时间】:2020-11-15 11:50:49
【问题描述】:

我的任务是在模​​板上制作 BST(二叉搜索树)。我被困在转换问题上,使用模板:/。我不知道如何克服它。我在没有模板的情况下尝试了这段代码,它可以正常工作。

 #include <iostream>
using namespace std;
template <class T> struct drzewo{
    private:
        int value;
        drzewo *l ,*r;
    public:
        T NewDrzewo(int key){
            struct drzewo *temp=(struct drzewo*)malloc(sizeof(struct drzewo));
            temp->value=key;
            temp->l=temp->r=NULL;
            return temp;
        }
        void inorder(struct drzewo *root) {
            if (root != NULL) {
                inorder(root->l);
                cout << root->value << " -> ";
                inorder(root->r);
            }
        }
        T insert(struct drzewo *drzewo, int value) {
            if (drzewo == NULL) return NewDrzewo(value);
            if (value < drzewo->value){
                drzewo->l=insert(drzewo->l, value); 
            }
            else{
                drzewo->r=insert(drzewo->r, value);
            }
            return drzewo;
        }
};
int main(int argc, char** argv) {
    struct drzewo <int> *root = NULL;
    root->insert(root, 8);
    return 0;
} ```

【问题讨论】:

  • 取消引用 NULL 是个坏主意。
  • 请逐字发布您收到的编译器消息,并在源代码中注明相关行。
  • 我被困在转换问题上,因为使用模板你需要实际解释问题是什么,并显示你得到的编译器错误。
  • 使用模板意味着你会玩这些类型。您使用template&lt;class T&gt;,但仍在处理int value

标签: c++ type-conversion


【解决方案1】:

您使用的模板机制不正确。

template <class T> struct drzewo{
    private:
        int value;  // THIS MAKES NO SENSE

模板的想法是将存储元素的类型作为参数传递,而不是对其进行硬编码。因此你应该使用

        T value;

而不是

        int value;

由于T 是存储元素的类型,而不是树的类型,

T NewDrzewo(int key){

也是错的,你应该用

drzewo* NewDrzewo(T key){

同样,T insert(... int value) 应该是 drzewo* insert(... T value)

还有其他与此无关的问题,例如(不分先后):

  1. 使用malloc。不要那样做,改用new
  2. 不使用构造函数和析构函数。
  3. 无缘无故地使用详细类型说明符 (struct drzewo)。请改用drzewo
  4. 使用过时的NULL 宏。请改用nullptr
  5. using namespace std 很危险,千万不要这样做。
  6. insertNewDrzewo 应该是静态函数,因为它们不使用 thisroot-&gt;insert(root, 8) 应该是 root = drzewo&lt;int&gt;::insert(root, 0),因为当 root 是空指针时,root-&gt; 是非法的。

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2022-12-28
    • 2018-06-20
    • 2017-03-21
    • 1970-01-01
    • 2020-08-18
    相关资源
    最近更新 更多