2013-05-14 29 views
6

çıktı için operatöre < < numaralı telefonu destekleyen bir sayı sınıfı uygulamanız gerekiyor. "Tanımlayıcı "ostream i dahil satışlardaki nedense gelen" tanımsız" ve buna burada"ostream" tanımlayıcısı tanımlanmamış bir hata

da başlık dosyasını deneyin: i bir hata var

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 

neden derleyici isnt arkadaş fonksiyonundaki ostreayı tanımak?

std::ostream 
// ^^^^^ 

Yani operatör beyanı haline gelmelidir: Tam olarak sınıf yaşıyor ad adı ile adını ostream nitelemek gerekir

+0

Tüm standart kitaplık türlerinde ve işlevlerinde olduğu gibi, yalnızca * * "akım" yoktur. Sadece “std :: ostream” var. –

cevap

11

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

Alternatif olarak, bir olabilir Niteliksiz addan önce using bildirimi ostream belirir:

using std::ostream; 

Bu, programınızın geçerli sürümünüzde olduğu gibi, ostream adının tam niteliklere sahip olmadan yazılmasını sağlar.

+0

teşekkürler çok! namespace std kullanabilir; ya çalışacak? –

+3

Bir üstbilgideki global ad alanında 'using' kullanmamalısınız, ancak bu, başlığın diğer kullanıcıları için ad çakışmasına neden olabilir. –

+1

@AviadChmelnik: İşe yarayacak, ama Mike Seymour'un işaret ettiği gibi, isim çatışmaları getirme olasılığı yüksek olduğundan (özellikle de global isim-alanı kapsamına bir başlık koyulduğunda) kötü bir programlama pratiği olarak kabul ediliyor. Eğer std :: ostream' kullanarak –

0

Andy Prowl'un cevabı harika ama lütfen üstbilgiye "std :: ostream kullanarak" koymaya karşı koy. Bunu yaparsanız, başlık dosyanızı kullanan diğer derleme birimleri de varsayılan olarak bu ad alanına 'sahip' olarak sahip olacak ve ad alanı çakışmalarıyla kötü derleme hataları alabilirsiniz.

+2

'seçeneğini kullanabiliyorsanız seçmeli olmalısınız. Kullanıldığı ad alanına bir ad koyar: 'ostream'. Bu, hiçbir adın 'std'den bu isim alanına ** her isim adını koyan namespace std; –

+1

Diğer derleme birimleri yalnızca isim alanı değil, 'ostream' adını alacaklardır. Yine de, bunun kötü bir fikir olduğuna katılıyorum. – juanchopanza

İlgili konular