2

先日、プログラムでcoutをオーバーロードする方法を教えられましたが、すべてを出力する方法がわかりません。

 template <NODETYPE>
 friend ostream &operator <<(ostream &, List<NODETYPE>& );


template<typename NODETYPE>
ostream &operator <<(ostream& output, List<NODETYPE>& value)
{ 
    output << value;
    return output;
}

ただし、私のプログラムには出力するオブジェクトが少なくとも5つあり、そのうちの2つはdoubleです。「doubleはテンプレート定数パラメーターの有効な型ではありません」というエラーが表示されます

私の2つの問題は次のとおりです。最初のオブジェクトだけでなく、すべてのオブジェクトを出力するにはどうすればよいですか。ダブルを出力するにはどうすればよいですか。どうぞよろしくお願いします!

編集:巨大な編集:::

さて、私は何か間違ったことをしていることに気づき、ヘッダーとソースファイルを再配置しました。

そして、講師のクラスを欠席することは、これまでに犯した最大の過ちの1つであることに気づきました。私の次の誤りは、私が仮定した情報ではなく、私のすべての仮定をあなたに与えることでした。

私の代入では、次のように書かれています。•リンクリストを出力する代入演算子とフレンド関数を記述します。

私の主な関数(私が変更することを許可されていない関数)の他のほとんどすべての行に、coutがあります:

List<int> Li, Li2, Li3;
List<double> Ld, Ld2;

これらは私のオブジェクトです。そして、私のすべてのカウトは次のようになります。

  cout << "Ld is: " << Ld << endl;

ヘッダーファイルとソースファイルを再配置した後、次のエラーが発生しました: "'std :: operator << [with_Traits = std :: char_traits](((std :: basic_ostream>&)(& std :: cout))、((const char *)'Ld is "))<

私が持っているすべてのcoutステートメントに対してそれを取得します。Ldの終了ステータスが1か何かよりも多くの情報があるので、これから説明します。

私はまだこのostreamオーバーロード関数の使用に完全に熱心ではないので、助けていただければ幸いです。ありがとうございました。

編集:: -

私はこの投稿にほとんどすべてのコードを入れました:collect2:Ldが1つの終了ステータスを返しましたビルドメイクエラー

誰かが私に過負荷を手伝ってくれるとしたら、それは私が残した唯一の問題だと思うので、他のすべてを理解することができます。

ありがとう!!

4

3 に答える 3

1

List<NODETYPE>各ノードを印刷して、で何らかの反復を実行する必要があります。そうしないと、演算子が自分自身を呼び出すという無限の再帰が発生します。

この例では、1つのスペースで区切られた要素を1行で出力します。Listインターフェイスがわからないため、反復メカニズムの詳細は省略しました。

template<typename NODETYPE>
ostream &operator <<(ostream& output, const List<NODETYPE>& value)
{ 
   for ( node in value) // pseudocode iteration
   {
     output << node << " ";
   }
   return output;
}

これは、ノードタイプにが存在することを前提としてostream& operator<<いますが、そうでない場合も指定する必要があります。また、リストを。で渡すことに注意してくださいconst reference。これには多くの利点があります。そのうちの1つは、一時オブジェクトを渡すことができることです。

宣言に関しては、そこにfriendも必要ですが、そもそもtemplate<typename T>演算子が必要かどうかは明らかではありませんfriend。リストは通常​​、パブリックインターフェイスの要素へのアクセスを提供します。

于 2012-09-20T05:23:38.370 に答える
0

1)テンプレート引数として使用するのが自分で定義したクラスであり、定義しているがのプライベートメンバーにアクセスする場合friendを除いて、宣言は不要です。今はそうですので、申告の必要はありません。NODETYPEoperator<<NODETYPENODETYPEdoublefriend

テンプレート引数として使用したい他のデータ型があり、それらの他のデータ型が独自のクラスである場合は、それらのクラスfriendに宣言を配置します。(これは、以下で説明するように、このタイプに当てはまる場合があります)。List

2)現在、あなたoperator<<は再帰的です。(他の回答で示唆されているように)取得したオブジェクトのリストを何らかの方法で繰り返すNODETYPE必要があります。

for(List::const_iterator it = value.begin() ; it != value.end() ; ++it)
  output << *it;

(上記は、データ型がとイテレータを実装していることを前提としていListます。の要素を反復処理する別の方法を使用することもできます。そのためには、実際にデータ型のプライベートメンバーにアクセスする必要があります。その場合は、宣言する必要があります。クラス定義内のフレンドテンプレート(!を含む)として。 )begin()end()ListListoperator<<typenameList

于 2012-09-20T05:37:51.723 に答える
0

List<T>は、リスト内のタイプのoperator<<各要素を反復処理し、それぞれTを呼び出す必要output << element;があります。

次に、オブジェクトをT作成する各型が、必要な各変数を、必要な形式(など)で出力するを実装していることを確認します。組み込み型はすでにこれを行っているため、たとえば、この手順は必要ありません。List<T>operator<<output << "(" << x << "," << y << ")"List<int>

于 2012-09-20T05:25:53.603 に答える