Newsgroup: it.comp.lang.c++
Titolo: iostream o fstream?

Premetto che non so se e' un errore mio o del compilatore (g++ 3), 
pero' mi e' capitata una cosa del genere:
        #include <iostream>
        void foo() {
                std::ifstream("prova.txt");
        }
provando a compilare g++ mi da questo errore:
"prova.cc:7: variable `std::ifstream f' has initializer but incomplete 
type"
errore che, tra l'altro, non riesco neppure a capire sino in fondo 
(cosa vuol dire "incomplete type"?). Sono andato a controllare ed in 
effetti il costruttore di ifstream ha un secondo parametro che indica 
la modalita' di apertura, pero' tale parametro ha un valore di default 
quindi il codice qua sopra dovrebbe corretto.
La cosa curiosa e' che se provo a #includere <fstream> anziche' 
<iostream> tutto funziona correttamente.
Qual e' l'inghippo?
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 type"
Sei sicuro di aver postato il codice giusto? Non vedo nessuna variabile
chiamata f!
Per usare ifstream dovresti includere <fstream> e non solo <iostream>.
In teoria potrebbe darti "ifstream undefined" e capiresti subito che il
problema è che <iostream> non dichiara ifscream. Purtroppo invece la tua
implementazione di <iostream> comprende una forward reference a ifstream
e questo cambia l'errore (il compilatore sa che ifstream è il nome di
una classe, ma non sa come è fatta perchè non ne ha vista la
dichiarazione e pertanto non sa come compilare quel costruttore).
Prova a compilare questo:
class MyClass;
int main()
{
    MyClass a("prova.txt");
    OtherClass b("prova.txt");
}
dovrebbe darti lo stesso errore (o uno molto simile) sulla dichiarazione
di a (e uno diverso su quella di b).
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 Qual e' l'inghippo?
Nessun inghippo devi usare <fstream>, potrebbe esistere qualche
versione di <iostream> che include <fstream>, ma non
penso che sia obbligatorio. Peraltro lo std dice che le dichiarazioni
di
...
  template <class charT, class traits = char_traits<charT> >
    class basic_ifstream;
  typedef basic_ifstream<char>    ifstream;
  typedef basic_ifstream<wchar_t> wifstream;
...
si trovano in <fstream> per cui e` inutile confidare su
inclusioni delegate.
ciao
Massimo

 type"
Probabilmente da qualche parte in <iostream> c'e' una forward
declaration di ifstream, quindi il compilatore sa che esiste il
tipo ifstream ma non ha visto la definizione e non puo' creare
istanze.
Ho provato a compilare il codice con il gcc 3.0.2 e mi dice:
  prova.cc: In function `void foo()':
  prova.cc:4: invalid use of undefined type `class std::ifstream'
  /usr/include/g++-v3/bits/std_iosfwd.h:81: forward declaration of `class 
     std::ifstream'
che e' molto piu' chiaro.
	Mauro

 includere altri header standard.
ah, ok, grazie. In effetti sapevo di dover includere <fstream> e 
l'inclusione di <iostream> era un errore di distrazione; ma era il 
messaggio di errore che non riuscivo a capire (e cavolo! Potevano anche 
scrivere un messaggio un po' piu' capibile...).
ringrazio anche Massimo e Andrea,
