Héritage entre istream et ifstream

Le
g.gourdin
Bonjour à tous,

Je ne comprends pas pourquoi le code suivante ne compile pas chez moi :

#include <fstream>

class my_class
{
public:

void save(std::ostream & os) const {};
void load(std::istream & is) {};
};

int main(int argc, char *argv[])
{
my_class m;
m.load(std::ifstream("test1"));
m.save(std::ofstream("test2"));
}

Le compilateur me sort:

test.cpp: In function ‘int main(int, char**)’:
test.cpp:14: error: no matching function for call to ‘my_class::load(std:=
:ifstream)’
test.cpp:8: note: candidates are: void my_class::load(std::istream&)
test.cpp:15: error: no matching function for call to ‘my_class::save(std:=
:ofstream)’
test.cpp:7: note: candidates are: void my_class::save(std::ostream&) const

Je ne vois pas où le problème: ifstream (et ofstream) dérive bien de =
istream (de ostream).

Merci pour vos éclairages.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain Ketterlin
Le #24636681
writes:

#include <fstream>

class my_class
{
public:

void save(std::ostream & os) const {};
void load(std::istream & is) {};
};

int main(int argc, char *argv[])
{
my_class m;
m.load(std::ifstream("test1"));
m.save(std::ofstream("test2"));
}



Tu ne peux pas passer un temporaire comme référence non-const. Do nc :

- soit le paramètre de save devient (const ostream & ...) -- mais je
doute que cela ait un sens

- soit tu déclares une variable au lieu d'utiliser un temporaire

-- Alain.
James Kanze
Le #24669701
On Friday, July 13, 2012 2:01:37 PM UTC+1, Alain Ketterlin wrote:
writes:

> #include <fstream>

> class my_class
> {
> public:

> void save(std::ostream & os) const {};
> void load(std::istream & is) {};
> };

> int main(int argc, char *argv[])
> {
> my_class m;
> m.load(std::ifstream("test1"));
> m.save(std::ofstream("test2"));
> }

Tu ne peux pas passer un temporaire comme référence non-const. Donc :

- soit le paramètre de save devient (const ostream & ...) -- mais je
doute que cela ait un sens

- soit tu déclares une variable au lieu d'utiliser un temporaire



En général, je conseillerais une variable explicite, ne
serait-ce que pour pour pouvoir vérifier que l'ouverture a bien
réussi avant de se servir du flux. Mais sinon, il existe
toujours la possibilité d'appeler une fonction membre du flux
qui renvoie une référence non-const, p.e. :

m.load( std::ifstream( "test1" ).flush() );

--
James
Publicité
Poster une réponse
Anonyme