1

以下代码是 Red Black Tree 程序的一部分,它必须采用itemchar 或 int,所以我决定使用模板类,但是我不知道如何通过完整的程序扩展它,编译器向我发送了一千个错误:

代码有德语名称,所以如果它更容易理解,我将翻译其中一些:

baum = tree
knote = node
links = left
rechts = right
rot = red
doppel = double
mittlere = middle
eltern = parent
einfuegen = insert
rs = rb = red black

记事本.hpp

#pragma once

template <class T>
class Knote {
public:
    Knote(T data = 0);
    bool rot;
    T item;
    Knote *links;
    Knote *rechts;
    Knote *eltern;
};

记事本.cpp

#include "Knote.hpp"

Knote<int>::Knote(int data)
{
    this->item = data;

    eltern = nullptr;
    links = nullptr;
    rechts = nullptr;
    rot = true;
}

现在我应该怎么做?

鲍姆.hpp

#pragma once

#include "Knote.hpp"

#include <vector>

class Baum
{
public:
    Baum();
    void einfuegen(int x);
    void ausgabe_levelorder();
    void ausgabe_inorder();
private:
    Knote<int>* head;
    void rs_einfuegen(Knote<int>* &knote, Knote<int>* &eltern, int x, bool sw);
    int rot(Knote<int>* &knote);
    void links_rotation(Knote<int> * &links_knote);
    void rechts_rotation(Knote<int> * &links_knote);
    void levelorder(Knote<int>* knote, std::vector<Knote<int>*> &knoteQueue, int niveau, std::vector<int> &niveauQueue);
    void sort_levelorder(std::vector<Knote<int>*> &knoteQueue, std::vector<int> &niveauQueue);
    void inorder(Knote<int>* knote);
};

鲍姆.cpp

#include "Baum.hpp"

#include <iostream>

using namespace std;

Baum::Baum()
{
    ...
}

// XXX
void Baum::einfuegen(int x)
{
    ...
}

// XXX
int Baum::rot(Knote<int>* &knote)
{
    ...
}

// XXX
void Baum::rs_einfuegen(Knote<int> *& knote, Knote<int> *&eltern, int x, bool sw)
{
    ...
}

// XXX
void Baum::links_rotation(Knote<int>* &links_knote)
{
    ...
}

// XXX
void Baum::rechts_rotation(Knote<int>* &rechts_knote)
{
    ...
}

// XXX
void Baum::ausgabe_levelorder()
{
    ...
}

// XXX
void Baum::levelorder(Knote<int>* knote, vector<Knote<int>*> &knoteQueue, int niveau, vector<int> &niveauQueue)
{
    ...
}

// XXX
void Baum::sort_levelorder(vector<Knote<int>*> &knoteQueue, vector<int> &niveauQueue)
{
    ...
}

// XXX
void Baum::ausgabe_inorder()
{
    inorder(head->rechts);
    cout << endl;
}

// XXX
void Baum::inorder(Knote<int>* knote)
{
    if (knote != nullptr)
    {
        inorder(knote->links);
        cout << knote->item << " ";
        inorder(knote->rechts);
    }
}
4

2 回答 2

2
  1. 不需要Knote<T>在课堂上使用。只需使用Knote. 代替

    Knote<T> *links;
    Knote<T> *rechts;
    Knote<T> *eltern;
    

    只需使用:

    Knote *links;
    Knote *rechts;
    Knote *eltern;
    
  2. 使用类模板时,请确保提供模板参数。

    Knote* head;
    

    是不正确的。你需要使用

    Knote<int>* head;
    

    或者

    Knote<char>* head;
    

    您选择适合的类型Baum

  3. 将 .cpp 文件中的实现移至Knote.h 文件。请参阅为什么模板只能在头文件中实现?.

于 2015-05-21T18:16:28.737 回答
0

对于 Knote.h,你的template <typename T>行应该是template <class T>

此外,在 Knote 的构造函数中,不能将 int(数据)分配给 T 变量(项目)。对于构造函数,您应该使用T data,而不是int data,因为您不知道数据需要是什么类型(因为它是一个模板)。

模板类也没有 cpp 文件。实现必须在类声明之后的 .h 中进行(除非前向声明)。如果您确实想将标头和“实现”代码部分分开,请保持 .h 正常,但为您的方法实现创建一个 .hpp 文件。在类声明后的 .h 中,放入#include "Knote.hpp".

对于普通方法,格式如下:

template <typename T>
void Knote<T>::myMethod(parameters)
{
    //normal method stuff
}

对于将模板类作为参数的友元方法,例如重载的插入运算符 (<<),格式如下:

//in class declaration in .h
template <class T>
class Bob
{
    //variables here

    template <typename U>
    void myfunc(Bob<U> value);  //have to use a different template variable

}

//define as normal in the .hpp (or further down the file if no .hpp used)
于 2015-05-21T18:28:13.060 回答