Newsgroup: it.comp.lang.c++
Titolo: leggitutto

Riguardo l'esempio scritto da Alex Martelli, purtroppo non riesco a
farlo compilare né con il BC++ 5.5 né con il DJGPP. Il programma č
questo
#include <iostream>
#include <fstream>
#include <string>
void leggitutto(std::istream& ist, std::string& result)
{
    std::stringbuf ost(std::ios_base::out);
    ist >> &ost;
    result.swap(ost.str());
}
int main()
{
    std::ifstream ist( "LEGGI TUTTO.CC" );
    std::string s;
    leggitutto( ist, s );
    std::cout << s << std::endl;
}
e il risultato con il BC++ 5.5 č
Error E2450 LEGGI TUTTO.CC 8: Undefined structure 'std::stringbuf' in
function l
eggitutto(std::istream &,std::string &)
Error E2034 LEGGI TUTTO.CC 8: Cannot convert 'int' to 'std::stringbuf'
in functi
on leggitutto(std::istream &,std::string &)
Warning W8030 LEGGI TUTTO.CC 9: Temporary used for parameter 'p' in call
to 'std
::istream::operator >>(void * &)' in function leggitutto(std::istream
&,std::str
ing &)
Error E2315 LEGGI TUTTO.CC 10: 'str' is not a member of
'std::stringbuf', becaus
e the type is not yet defined in function leggitutto(std::istream
&,std::string
&)
Warning W8057 LEGGI TUTTO.CC 11: Parameter 'result' is never used in
function le
ggitutto(std::istream &,std::string &)
*** 3 errors in Compile ***
Manca forse qualche #include?
EMG

#include <sstream>
MM

 Manca forse qualche #include?
Mi pare che manchi #include <sstream>.
Alex

::swap(basic_string<char,string_c
har_traits<char>,__default_alloc_template<false,0> > &) <near match>
EMG

 Mi pare che manchi #include <sstream>.
Purtroppo, come ho già scritto, non è sufficiente. ???
EMG

 har_traits<char>,__default_alloc_template<false,0> > &) <near match>
Perche` dice che e` solo un near match?  Nella chiamata
a swap sto passando una variabile di tipo std::string e
quindi il match dovrebbe essere esatto.  O ricordo male
la riga di codice in gioco?
Alex

 la riga di codice in gioco?
La riga č
result.swap(ost.str());
Quindi effettivamente stai passando una std::string. Possibile che due
dei compilatori attualmente piů diffusi siano cosě in errore?
EMG

 wrote in message
3953CA6D...@flashnet.it...

ost.str() dovrebbe ritornare una reference a string, mentre
l'errore di gcc fa sembrare che, secondo lui, ritorni una
string per valore (o una const reference).  Si puo` provare
ost.str().swap(result), ma il problema dovrebbe riproporsi
(non si puo` chiamare swap se non su di una string) se si
ha una const reference, e se poi si ha un ritorno per valore,
addio efficienza.  Il bug (se tale e`) di BCC continua
invece a lasciarmi molto perplesso perche` non capisco
da dove puo` derivare questo errore nella risoluzione
dell'overload.
La libreria standard del gcc e` notoriamente il suo punto
debole da molti anni e prima o poi lo rimedieranno.  Il
difetto di BCC mi sembra piu` preoccupante, perche` i
meccanismi di risoluzione di overload e la loro interazione
con i template sono parti delicate e profonde del
"profondo" funzionamento del front-end del compilatore...
Alex


Se non gli piace il puntatore, passagli la referenza:
void leggitutto(std::istream& ist, std::string& result)
{
    std::stringbuf ost(std::ios_base::out);
    ist >> ost;
    result.swap(ost.str());
}
Tanto il polimorfismo funziona anche con le referenze.
Manlio Perillo

 Tanto il polimorfismo funziona anche con le referenze.
Nell'esempio di Alex già c'era il passaggio per reference... ma ecco
qual'era l'errore! Era scritto così
ist >> &ost;
invece che così
ist >> ost;
Ora funziona perfettamente con il BC++ 5.5 (con il DJGPP no). Mi pareva
strano...
EMG

 wrote in message
39551C78...@flashnet.it...

A me par strano ancora... la signature del metodo di basic_istream<>
che sto usando e`:
    basic_istream& operator>>(basic_streambuf<E, T> *sb);
vedi 27.6.1.2.3 sub 11.  Il bug nel BC++ 5.5 sembra dunque l'omissione
dell'* nell'argomento...?
Comunque, e` un bug certo piu` comprensibile (benche` non meno
scocciante) in questo caso.
Alex


La signature che indichi è presente nell'header istream.h del BCC 5.5:
    istream_type& operator>>(void*& p);
    istream_type& operator>>(streambuf_type& sb);           // Non so se sia
standard
    istream_type& operator>>(streambuf_type *sb);
Credo proprio sia uno strano bug.
Manlio Perillo

 dell'* nell'argomento...?
Nell'header file istream.h del BC++ 5.5 trovo
istream_type& operator>>(streambuf_type& sb);
istream_type& operator>>(streambuf_type *sb);
dove
typedef basic_streambuf<charT, traits>           streambuf_type;
Non ci sono altre dichiarazioni di operator>> che contengano streambuf.
Che significa?
EMG
PS. Che compilatore usi che sembra sempre perfettamente compliant?

 PS. Che compilatore usi che sembra sempre perfettamente compliant?
Microsoft Visual C++: il compilatore di per se` ha vari difetti
rispetto allo standard, ma la libreria, che e` la versione di
Plauger (dinkumware), e` ottima (soprattutto con i fix che si
trovano sul sito della dinkum).
Alex

Purtroppo non utilizzo entrambe i compilatori da te citati.
In VC6 il codice funziona correttamente e l'header che ti
ho indicato è sufficiente.
Ciao,
MM