0

クラスには友達機能があります。(ヘッダーファイル。head.h)クラス外のhead.cppとhead.hに実装しました。ostream&operator <<(ostream&out、TreeNode * ptr); 私はhead.cppにも実装しました。何か問題はありますか?

ヘッダーファイル

friend ostream& operator<< (ostream& out, const TreeDB& ptr);
 ostream& operator<< (ostream& out, TreeNode* ptr);

実装

ostream& operator<< (ostream& out, TreeNode* ptr)
{
 if(rhs!=NULL)
 {
  operator<<(out,ptr->Left());
  out<<(*(ptr->Entry()));
  operator<<(out,ptr->Right());
 }
 return out;
}




ostream& operator<< (ostream& out, const TreeDB& ptr)
{
 return (operator<<(out,ptr.root));
}

エラー:'operator <<(std :: basic_ostream>&、DBentry const&)'への未定義の参照

DBentryは、データベースエントリを操作する別のクラスです。

4

2 に答える 2

2

TreeDB印刷用のグローバル関数は、クラス定義(私たちが想定している)で次のようにフレンドリングされています。

friend ostream& operator<< (ostream& out, const TreeDB& ptr);

後でそれを次のように定義します

ostream& operator<< (ostream& out, const TreeDB& ptr)
{
   return (operator<<(out,ptr.root));
}

注意:ptrconstです。したがってptr.root、constでもあります

次に、ノードポインタ演算子を見てください。

ostream& operator<< (ostream& out, TreeNode* ptr)

ptrはconstではないため、この演算子は適用されません。そのはず:

ostream& operator<< (ostream& out, const TreeNode* ptr)

あなたがそれを修正したら。エラーメッセージ:

エラー:'operator <<(std :: basic_ostream>&、DBentry const&)'への未定義の参照

これは、次のものがないため、ほぼ確実です。

ostream& operator <<(ostream& os, const DBEntry& entry);

このような演算子がある場合は、で正しくconst宣言しなかったのと同じように、右側に修飾子を付けて宣言されていない可能性が高くなります。const TreeNode*operator <<()

于 2012-11-22T09:48:04.243 に答える
1

未定義の参照を取得した場合、多くの場合、関数定義の欠落、定義および宣言との署名のわずかな違い、または関数の定義がコンパイル/リンクされていないことの症状です。

したがって、引数が一致すること、名前空間が一致すること、および関数の定義が実際にコンパイルされていることを確認してください。

私があなたが提供したコードで見ることができる限り、あなたは演算子<<を定義していませんDBEntry& const

于 2012-11-22T09:29:33.343 に答える