2

Binary Search Tree クラスに取り組んでいますが、オーバーロードされたストリーミング演算子関数のコーディングに問題があります。これが私のコードです...オンラインで(および教授のパワーポイントで)見つけることができたすべてのことを行ったので、何が間違っているのかわかりません。

*数秒前に編集して、コードの変更を更新しました。フレンド関数にあったものと同様のコードを持つフレンドに送信されるオブジェクトから関数を呼び出すことにしました...

ヘッダー ファイル (.h ファイル) の関連ヘッダー:

friend ostream& operator<<(ostream& out, const BST& tree);

void leveltraversal(ostream& out);

関連する「プライベート」データ/ヘッダー ファイル (.h ファイル) のネストされたクラス:

private:
  class BinNode {
  public:
    T data;
    BinNode* left;
    BinNode* right;
    BinNode() : left(NULL), right(NULL) {}
      BinNode (T item): data(item), left(NULL), right(NULL) {}
  };

  typedef BinNode* BinNodePtr;
  BinNodePtr myRoot;

関連する実装ファイル関数:

ostream& operator<<(ostream& out, const BST& tree)
{
  tree.leveltraversal(out);
  return out;
}

template <typename T>
void BST<T>::leveltraversal(ostream& out)
{
  int level = 0;
  BinNodePtr temp = myRoot;
  queue<BinNodePtr> nodes;
  nodes.push(temp);
  out << endl << endl;
  while (!nodes.empty()){
      temp = nodes.front();
      level = recursive_level(temp->data);
      out << endl << endl;
      out << "Node data: " << temp->data;
      out << endl;
      out << "Level: " << level;
      nodes.pop();
      if (temp->left)
        nodes.push(temp->left);
      if (temp->right)
        nodes.push(temp->right);
  }
}

コンパイル エラーを投稿したいと思いますが、エラーはかなりの数の行にわたって続き、問題は自明だと思います。ただし、必要に応じて更新します。

4

1 に答える 1

0

エラー メッセージを一覧表示しておらず、発生している問題の種類についても説明していないため、お役に立てません。ただし、問題を再現するためにいくつかの空白を埋めようとしましたが、コードにいくつかの問題が見つかりました。

  • のシンボルが見つからないというエラーが表示される場合operator<<は、テンプレート フレンドがトリッキーである可能性があります。http://www.parashift.com/c++-faq/template-friends.htmlを参照してください。最も簡単な回避策は、クラス宣言内で関数を定義することです。
template <typename T>
class BST {
   ...
   friend std::ostream& operator<<(std::ostream& out, const BST& tree)
   {
       tree.leveltraversal(out);
       return out;
   }
  • In operator<<you take a const BST& tree(つまり、この参照を介して元のオブジェクトを変更できないことを意味します)。したがって、leveltraversal関数も宣言する必要がありますconst。オブジェクトで非constメンバー関数を呼び出すことはできません。const許可されていれば、オブジェクトを変更して、constネスを壊すことができます。
void leveltraversal(std::ostream& out) const;
  • 言語を学習する場合は、を避けることをお勧めusing namespace std;ます。.

これらの変更により、コードは clang と g++ の両方で問題なくビルドされました。

于 2012-11-28T13:07:55.537 に答える