只是一些简单的错误

时间:2012-11-05 05:36:16

标签: c++ binary-search-tree

我收到一些我不知道的错误,并且花了很多时间把头发拉出来。这是我的标题:

#ifndef MYBSTREE_H
#define MYBSTREE_H

#include "abstractbstree.h"
#include "MyBSTreeFunc.h"
using namespace std;

template<typename T>
class TreeNode
{
  public:
    T m_data;
    TreeNode* m_right;
    TreeNode* m_left;
};

template<typename T>
class MyBSTree:public AbstractBSTree<T>       //LINE 18
{
  private:

    TreeNode<T>* m_root;

  public:


    void MyBSTree();

    int size() const;

    bool isEmpty() const;

    int height() const;

    const T& findMax() const;

    const T& findMin() const;

    int contains(const T& x) const;

    void clear();

    void insert(const T& x);

    void remove(const T& x);

    void printPreOrder() const;

    void printPostOrder() const;

    void print() const;     
};

#endif

我的实施文件:

第1-6行

void MyBSTree()
{
  m_root -> m_data = NULL;
  m_root -> m_right = NULL;
  m_root -> m_left = NULL;
}

第13-21行

template<typename T>
bool MyBSTree<T>::isEmpty() const
{
  if (m_root== NULL)
    return true;

  else
    return false;
}

第28-35行

template < typename T >
const T& MyBSTree<T>::findMax() const
{
  TreeNode* p = m_root;
  while(p -> m_right != NULL)
    p = p -> m_right;
  return p;
}

实现中第3行的错误说明'm_root'未在此范围内声明。但是第4行和第5行很酷。我猜是因为m_data不是指针?我不知道。

接下来,第14行和第21行以及其他一些人说它期望在'&lt;'之前有一个初始化器。令牌。我认为它们都是同一个问题所以我只在这里放了一些。

最后,对于标题中的第18行说:“模板结构MyBSTree重新声明为另一种符号。”然后它说我的实现的第1行是先前的'void MyBSTree'声明。我假设它们一起去。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您需要修复构造函数声明:

template < typename T >
classMyBSTree
{
  ... // some stuff
public:
  MyBSTree(); // no return type
  ... // some stuff
};

您还需要修复构造函数:

template < typename T >
MyBSTree::MyBSTree() // proper ctor definition
{
  m_root -> m_data = T(); // use the initializer for that data type
  m_root -> m_right = NULL;
  m_root -> m_left = NULL;
}

答案 1 :(得分:0)

第1-6行:您在名为void MyBSTree()的.cpp中定义了一个独立函数。这不是课程的一部分。你将这个函数命名为与你的类相同也是很糟糕的。看起来你想要这个是你的构造函数,在这种情况下你需要这个(我不会包含模板的东西,因为它不是问题):

// in .h
class MyBSTree {
  public:
    MyBSTree(); // No void
}
// in .cpp
// Uses MyBSTree namespace.
MyBSTree::MyBSTree() { /* initialize your pointers etc */ } 

这似乎是你的主要问题,也可能解决其他问题。

答案 2 :(得分:0)

  • 编译器找不到m_roots的原因是因为你的函数不是类的一部分。您可以通过使用operator ::(例如myBSTree::myBSTree(){};
  • 将函数放入类范围来解决此问题
  • 模板函数不能放在与其类不同的文件中,您需要在相同文件中定义所有模板类和函数。将函数的实现移动到头文件中。