2013-05-14 31 views
6

出力のためにオペレータ< <をサポートする番号クラスを実装する必要があります。 私はエラーを持っている:「識別子 『のostreamは、』未定義である」いくつかの理由から、ヘッダファイル本家の私は含まれており、ここにも識別子 "ostream"は定義されていませんエラー

を試してみてください。

Number.h

#ifndef NUMBER_H 
#define NUMBER_H 
#include <iostream> 
class Number{ 
public: 
//an output method (for all type inheritance from number): 
virtual void show()=0; 

//an output operator: 
friend ostream& operator << (ostream &os, const Number &f); 


}; 

#endif 

理由コンパイライマイチを友人機能でostreamを認識できますか?

std::ostream 
// ^^^^^ 

だからあなたのオペレータの宣言になるはずです::

また
friend std::ostream& operator << (std::ostream &os, const Number &f); 
//  ^^^^^      ^^^^^ 

、あなたが持っている可能性がありますが、完全にクラスの生活は、名前空間の名前で名前ostreamを修飾する必要が

+0

すべての標準ライブラリタイプおよび関数と同様に、*は* ostreamではないためです。 'std :: ostream'しかありません。 –

答えて

11

非修飾名の前にusing宣言があります。ostreamが表示されます。

using std::ostream; 

これにより、現在のバージョンのプログラムと同様に、完全修飾なしでostreamという名前を書くことができます。

+0

ありがとう!名前空間stdを使用するかもしれません。どちらもうまくいくでしょうか? –

+3

ヘッダーのグローバル名前空間に 'using'を置いてはいけませんが、ヘッダーの他のユーザーに名前の衝突を引き起こす可能性があります。 –

+1

@AviadChmelnik:動作しますが、Mike Seymourが指摘しているように、名前の衝突を招く可能性が高いため(特にグローバルな名前空間のスコープのヘッダーに配置する場合)、プログラミングの習慣としては不適切です。 –

0

アンディープロウルの答えは素晴らしいですが、ヘッダーに "std :: ostreamを使用"するのはやめてください。これを行うと、ヘッダーファイルを使用する他のコンパイル単位にも、この名前空間がデフォルトで 'used'になり、名前空間の衝突で不快なコンパイルエラーが発生する可能性があります。

+2

'std :: ostream'を使用すると、使用される名前空間に1つの名前が入れられます:' ostream'。これは、 'namespace std;'のような大きな問題のどこにもありません。これは '** std'のすべての**名前をその名前空間に入れます。 –

+1

他のコンパイルユニットは名前空間ではなく 'ostream'名だけを取得します。それでも、私はそれが悪い考えであることに同意します。 – juanchopanza

関連する問題