Syntax error : identifier 'ostream'

di il
12 risposte

Syntax error : identifier 'ostream'

Salve a tutti ragazzi, sto avendo non pochi problemi con una funzione che accetta come parametro uno stream.
Il codice è qualcosa del genere:

#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass {
bool X;
public: 
MyClass();
void Salva(ostream &);
~MyClass();
};
#endif

#include "MyClass.h"
#include <iostream>
#include <fstream>
using namespace std;

void MyClass::Salva(ostream &stream) { 
(X)? stream<<"Privato\n" : stream<<"Pubblico\n";
};

bene, quando provo a compilare questa parte di codice, il compilatore mi dà questi due errori:
error C2061: syntax error : identifier 'ostream'
error C2511: 'Salva' : overloaded member function 'void (class std::basic_ostream<char,struct std::char_traits<char> > &)' not found in 'MyClass'
        c:\documents and settings\utente\MyClass.h(3) : see declaration of MyClass'
Quello che voglio ottenere è un'unica funzione in grado di scrivere le stesse cose sia su schermo e sia su un file di testo.
Ho provato anche a creare e compilare una versione semplificata del codice, senza dividere l'header dal codice sorgente, e funziona a dovere. Quindi vorrei capire, che cosa sto sbagliando in questo codice? Potete darmi una mano? Sono disperata, lo devo consegnare a giorni Vi ringrazio in anticipo!

12 Risposte

  • Re: Syntax error : identifier 'ostream'

    Aggiungi al file header
    #include <fstream>
    using namespace std;
  • Re: Syntax error : identifier 'ostream'

    Grazie mille Sono un po' impedita nello 'spezzettare' il codice
    Ma quindi adesso dovrei cancellare queste due righe dal file sorgente, visto che le ho incluse nell'header?
  • Re: Syntax error : identifier 'ostream'

    Si giusto. Anche se io consiglio sempre di togliere quel
    using namespace std;
    dai header per ragioni che non so a spiegarti (perche è lungo il discorso). Avrei preferito usare la forma std::ostream e togliere l'using sopra.
  • Re: Syntax error : identifier 'ostream'

    In realtà il programma è molto più complesso di così... ne ho riportato solo una minima parte e semplificata al massimo, quindi se non includessi il namespace dovrei specificare ogni volta std::
    Comunque scusami se sono ripetitiva, ma vorrei capire, dovrei evitare in ogni caso di ripetere per più di una volta uno stesso header file? Ho diverse classi in realtà (quindi molti files .h e .cpp) e legate fra loro da relazioni di ereditarietà o composizione.
    Quindi se ne includo uno nella classe base (o nella classe contenitore) non lo dovrei più includere nelle derivate (o contenute) giusto?
    Per il namespace vale lo stesso?
    Ho fatto l'errore di scrivere prima tutto il programma in un unico blocco e poi frammentarlo così, e "per sicurezza" ho riportato più di una volta gli stessi header, e non penso sia corretto.
  • Re: Syntax error : identifier 'ostream'

    Per correttezza dovresti include un file header una sola volta. Includi nella classe base e tutte le derivate l'avranno già incluso di loro. Ma siccome non sempre si può si fa uso dei header guard proprio per non includerli più del neccessario.

    il std:: davanti io preferisco metterlo in quanto la classe std ha molti funzioni e supponiamo che tu ne crei una funzione con lo stesso nome il compilatore andrà in tilt perche non saprà cosa usare se tu fai uso di using .... (scusa il gioco di parole)

    Ma nel 99% dei casi è solo estetica
  • Re: Syntax error : identifier 'ostream'

    Ok, lo sto sistemando...Ma l' #include<....> lo devo scrivere nel file .h o nel .cpp?
    Il namespace std lo devo sempre includere solo nella classe base?
    Ho inoltre utilizzato uno stream di output dichiarandolo come extern, perchè, dopo aver diviso il programma, le varie parti non riconoscevano più lo stesso stream, complicandomi la vita. Come negli altri casi, ho messo quest'istruzione un po' dappertutto "extern ofstream scrivi;" Non è un errore, vero? Ho visto che come la tolgo da qualche parte mi dà errori.

    Bene, mi scuso per le domande forse stupide, ma l'architettura modulare non ci è stata spiegata per bene nel corso, e in più ho scritto questo programma mesi fa e, devo ammettere, certe cose non me le ricordo benissimo. In ogni caso grazie per le dritte che mi hai dato fin'ora
  • Re: Syntax error : identifier 'ostream'

    La parola chiave using ha potere localmente quindi devi scrivere ogni volta la riga che ti piace tanto (a me no) using namespace ....

    Per quanto riguarda l'extern secondo me stai sbagliando qualcosa. E' globale sto stream? è definito in un file non appartenente al progetto? Stai solo chiudendo la boca al compilatore dicendoli che la dichiarazione sta in un altro posto.
  • Re: Syntax error : identifier 'ostream'

    Ho provato a levare "using namespace std" da tutte le classi derivate, e lasciandolo soltanto nella classe base... il compilatore non dà errori e il programma funziona. Cosa devo fare?

    Per l'altra cosa provo a spiegare la situazione. Ho un file di testo che viene aperto nel programma, e lo stream di output (che ho chiamato 'scrivi') durante il corso di tutto il programma (varie centinaia di righe ) , scrive dei dati su questo file di testo.
    La cosa funzionava normalmente finchè non ho diviso il programma in moduli. Ciascuno di essi mi dava errore perchè non capiva cosa fosse questo 'scrivi', e provando a definirlo più volte, per il programma erano come dieci stream diversi.
    Ho risolto usando extern, come mi è stato suggerito di fare in qualche forum mesi fa, e l'ho scritto praticamente in ognuno dei moduli. Ho visto che funzionava e non ci ho più messo mani C'è un altro modo per risolvere?
  • Re: Syntax error : identifier 'ostream'

    Un altra parola magica: singleton ma forse quì andiamo sul avanzato. Un semplice singleton è di questo tipo:
    class S
    {
        public:
            static S& getInstance()
            {
                static S    instance;
                return instance;
            }
        private:
            S();
            S(S const&);              
            void operator=(S const&);
    };
    };
    statico, inizializzazione unica, uso infinito. Insomma variabile globale ma sotto forma di classe.
    Derivi la tua classe di scrittura da questa classe e ogni volta che lo vuoi usare fai
    S &s = S::getInstance();
    s.scrivi(......)
    Lo metti in un header aparte e ogni file che deve scrivere su stream includerà questo header. Quindi sarà per lui facile chiamarlo.
  • Re: Syntax error : identifier 'ostream'

    Potrebbe essere un'idea
    Ma allora mi puoi confermare se posso lasciare il namespace incluso solo nella classe base? Sono insopportabile lo so
  • Re: Syntax error : identifier 'ostream'

    Si lascia pure. In quel caso funziona. Se invece i file non sono correlati lo dovresti riscrivere.
  • Re: Syntax error : identifier 'ostream'

    Bene bene.....grazie mille per l'aiuto
Devi accedere o registrarti per scrivere nel forum
12 risposte