OVH Cloud OVH Cloud

Problème gcc 2.95.4 -> 3.2.2

3 réponses
Avatar
Nicolas HUYNH
Bonjour à tous,

Je dois porter du code (qui compilait sous GCC-2.95.4)
sous GCC-3 (en l'occurrence GCC-3.2.2). Je n'arrive pas
à corriger une erreur de compilation. Le code :

if (!s.ipfx(0)) {
...

l'erreur de GCC :

In function `int readline(std::istream&, String&, char, int)':
1226: no matching function for call to `std::basic_istream<char,
std::char_traits<char> >::ipfx(int)'

J'ai fait plusieurs modifs d'include avant d'en arriver là :

#include <iostream.h>
#include <limits.h>
#include <new.h>

devient :

#include <iostream>
#include <limits>
#include <new>
using namespace std;

Quelqu'un a-t-il une idée ?

Merci d'avance pour toute réponse !

N.

3 réponses

Avatar
Kurius
Nicolas HUYNH wrote:


J'ai fait plusieurs modifs d'include avant d'en arriver là :

#include <iostream.h>
#include <limits.h>
#include <new.h>

devient :

#include <iostream>
#include <limits>
#include <new>
using namespace std;

Quelqu'un a-t-il une idée ?

Merci d'avance pour toute réponse !

N.


gcc 3.2.2 est conforme au standard ISO c++98 qui apparement à defini ces
nouveaux fichiers d'entête

Avatar
kanze
Nicolas HUYNH wrote in message
news:...

Je dois porter du code (qui compilait sous GCC-2.95.4) sous GCC-3 (en
l'occurrence GCC-3.2.2). Je n'arrive pas à corriger une erreur de
compilation. Le code :

if (!s.ipfx(0)) {
...

l'erreur de GCC :

In function `int readline(std::istream&, String&, char, int)':
1226: no matching function for call to `std::basic_istream<char,
std::char_traits<char> >::ipfx(int)'


C'est normal. Le g++ 3.0 et après implémente les flux standard, celles
d'avant les flux classiques.

Avec un bon compilateur, la régle est simple : si tu inclus
<iostream.h>, tu as les flux classiques, si tu inclus <istream>, les
flux standard. (Même Microsoft, pour dire.) Dans le cas de g++,
malheureusement...

Donc, avec les flux classique :

if ( s.ipfx() ) {
// ou s.ipfx( 0 ) si tu ne veux pas sauter les blancs...
// ...
s.isfx() ;
}

avec les flux standard :

std::istream::sentry garde( s ) ;
// ou garde( s, false ) pour ne pas sauter les blancs...
if ( garde ) {
// ...
}

À titre d'information, pour gérer les incompatibilités, je n'inclus
jamais que « "gb/istream.hh" », qui ne contient que :

#ifndef GB_istream_hh
#define GB_istream_hh
#include "gb/Global.hh"
#include GB_DEPENDENT_INCLUDE( GB_HASNEWIOSTREAM, istream.hh )
#endif

Le fichier gb/Global.hh inclut les dépendences, en fonction d'un -I
option à la compilation (p.e. -Isparc/solaris/gcc ou
-Isparc/solaris/gcc3), et donc définit GB_HASNEWIOSTREAM comme 0 ou 1 ;
GB_DEPENDENT_INCLUDE est aussi défini dans Global.hh comme :

#define GB_EXPANDED( s ) s
#define GB_DEPENDENT_INCLUDE( cond, file )
GB_EXPANDED( <gb/ ## cond ## / ## file ## > )

Dans gb/0/istream.hh, j'ai :

#include <iostream.h>
#define GB_ISTREAM_PREFIX(stream)
if ( stream.ipfx() ) {
#define GB_ISTREAM_SUFFIX(stream)
stream.isfx() ;
}

et dans gb/1/istream.hh, j'ai :

#include "gb/Global.hh"
#include <istream>
#define GB_ISTREAM_PREFIX(stream)
GB_iostd::istream::sentry GB_CONCAT( sentry, __LINE__ )( stream ) ;
if ( sentry ## __LINE__ ) {
#define GB_ISTREAM_SUFFIX(stream)
}

Ensuite, dans mon code de operator>>, j'écris :

GB_iostd::istream&
operator>>( GB_iostd::istream& source, MaClasse& dest )
{
GB_ISTREAM_PREFIX( source ) ;
// ...
GB_ISTREAM_SUFFIX( source ) ;
return source ;
}

Je ne dis pas que c'est beau ; j'ai horreur des macros comme ça. Mais je
n'ai pas trouvé d'autre solution.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
Nicolas HUYNH
wrote:
Nicolas HUYNH wrote in message
news:...


Je dois porter du code (qui compilait sous GCC-2.95.4) sous GCC-3 (en
l'occurrence GCC-3.2.2). Je n'arrive pas à corriger une erreur de
compilation. Le code :



if (!s.ipfx(0)) {
...



l'erreur de GCC :



In function `int readline(std::istream&, String&, char, int)':
1226: no matching function for call to `std::basic_istream<char,
std::char_traits<char> >::ipfx(int)'



C'est normal. Le g++ 3.0 et après implémente les flux standard, celles
d'avant les flux classiques.

Avec un bon compilateur, la régle est simple : si tu inclus
<iostream.h>, tu as les flux classiques, si tu inclus <istream>, les
flux standard. (Même Microsoft, pour dire.) Dans le cas de g++,
malheureusement...

Donc, avec les flux classique :

if ( s.ipfx() ) {
// ou s.ipfx( 0 ) si tu ne veux pas sauter les blancs...
// ...
s.isfx() ;
}

avec les flux standard :

std::istream::sentry garde( s ) ;
// ou garde( s, false ) pour ne pas sauter les blancs...
if ( garde ) {
// ...
}


Monsieur Kanze,

MERCI BEAUCOUP !!! Cela marche impeccablement à présent,
vous m'enlevez une grosse épine du pied :-)

N.H.

PS : Désolé pour mes remerciements tardifs


À titre d'information, pour gérer les incompatibilités, je n'inclus
jamais que « "gb/istream.hh" », qui ne contient que :

#ifndef GB_istream_hh
#define GB_istream_hh
#include "gb/Global.hh"
#include GB_DEPENDENT_INCLUDE( GB_HASNEWIOSTREAM, istream.hh )
#endif

Le fichier gb/Global.hh inclut les dépendences, en fonction d'un -I
option à la compilation (p.e. -Isparc/solaris/gcc ou
-Isparc/solaris/gcc3), et donc définit GB_HASNEWIOSTREAM comme 0 ou 1 ;
GB_DEPENDENT_INCLUDE est aussi défini dans Global.hh comme :

#define GB_EXPANDED( s ) s
#define GB_DEPENDENT_INCLUDE( cond, file )
GB_EXPANDED( <gb/ ## cond ## / ## file ## > )

Dans gb/0/istream.hh, j'ai :

#include <iostream.h>
#define GB_ISTREAM_PREFIX(stream)
if ( stream.ipfx() ) {
#define GB_ISTREAM_SUFFIX(stream)
stream.isfx() ;
}

et dans gb/1/istream.hh, j'ai :

#include "gb/Global.hh"
#include <istream>
#define GB_ISTREAM_PREFIX(stream)
GB_iostd::istream::sentry GB_CONCAT( sentry, __LINE__ )( stream ) ;
if ( sentry ## __LINE__ ) {
#define GB_ISTREAM_SUFFIX(stream)
}

Ensuite, dans mon code de operator>>, j'écris :

GB_iostd::istream&
operator>>( GB_iostd::istream& source, MaClasse& dest )
{
GB_ISTREAM_PREFIX( source ) ;
// ...
GB_ISTREAM_SUFFIX( source ) ;
return source ;
}

Je ne dis pas que c'est beau ; j'ai horreur des macros comme ça. Mais je
n'ai pas trouvé d'autre solution.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16