2013-05-14 12 views
6

Ho bisogno di implementare una classe di numeri che supporta l'operatore < < per l'output. ho un errore: "identificatore "ostream" non è definito" da qualche ragione eventhough ho incluso e prova anche"ostream" errore non definito

qui il file di intestazione:

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 

perché l'isnt compilatore riconoscere ostream nella funzione amico?

+0

Perché, come per tutti i tipi e le funzioni di libreria standard, solo * non è * "ostream". C'è solo 'std :: ostream'. –

risposta

11

È necessario qualificare completamente il nome ostream con il nome dello spazio dei nomi quella classe vive in:

std::ostream 
// ^^^^^ 

Così la vostra dichiarazione di operatore dovrebbe diventare:

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

In alternativa, si potrebbe avere un using dichiarazione prima del nome non qualificato ostream appare:

using std::ostream; 

Ciò consentirebbe di scrivere il nome ostream senza qualifica completa, come nella versione corrente del programma.

+0

grazie mille! può usare namespace std; funzionerà o? –

+3

Anche se non dovresti mettere 'using' nello spazio dei nomi globale in un'intestazione, in quanto ciò potrebbe causare conflitti di nomi per altri utenti dell'intestazione. –

+1

@AviadChmelnik: Funzionerà, ma come sottolinea Mike Seymour, è considerato una cattiva pratica di programmazione, a causa dell'elevata probabilità di introdurre conflitti di nomi (specialmente se inseriti in un'intestazione nell'ambito di un namespace globale). Piuttosto essere selettivo se puoi –

0

La risposta di Andy Prowl è ottima, ma per favore resisti a mettere "usando std :: ostream" in un'intestazione. Se lo fai, anche altre unità di compilazione che usano il tuo file di intestazione avranno questo spazio dei nomi 'usato' di default e puoi ottenere errori di compilazione sgradevoli con scontri nello spazio dei nomi.

+2

'using std :: ostream' mette un nome nello spazio dei nomi in cui è usato:' ostream'. Questo non è affatto un grosso problema come l'uso di namespace std ;, che mette ** ogni ** nome da 'std' in quello spazio dei nomi. –

+1

Altre unità di compilazione avranno solo il nome di 'ostream', non lo spazio dei nomi. Tuttavia, sono d'accordo che è una cattiva idea. – juanchopanza