0

私が知らないいくつかのエラーが発生し、髪の毛を抜くのに多くの時間を費やしました。ここに私のヘッダーがあります:

#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 行目、および他の多くの行で、'<' トークンの前に初期化子が必要であると述べられています。それらはすべて同じ問題だと思いますので、ここではいくつかだけ掲載します。

最後に、ヘッダーの 18 行目で「テンプレート struct MyBSTree が別の種類のシンボルとして再宣言されました」と述べています。次に、実装の 1 行目は「void MyBSTree」の前の宣言であると表示されます。これらは一緒に行われると想定しています。

すべての助けをありがとう。

4

3 に答える 3

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;
}
于 2012-11-05T05:44:20.807 に答える
0

1〜6行目:.cppで.cppという名前のスタンドアロン関数を定義しましたvoid MyBSTree()。これはクラスの一部ではありません。関数にクラスと同じ名前を付けたのも悪いことです。これをコンストラクターにしたいようです。その場合は、これが必要です(問題ではないため、テンプレートのものは含めません)。

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

これがあなたの主な問題のようであり、他の問題も修正される可能性があります。

于 2012-11-05T05:45:12.030 に答える
0
  • コンパイラがm_rootsを見つけられない理由は、関数がクラスの一部ではないためです。これを修正するには、演算子::(eg myBSTree::myBSTree(){};)を使用して関数をクラススコープに配置します。
  • テンプレート関数をクラスとは別のファイルに配置することはできません。すべてのテンプレートクラスと関数を同じファイルで定義する必要があります。関数の実装をヘッダーファイルに移動します。
于 2012-11-05T05:46:50.027 に答える