Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Héritage entre istream et ifstream

2 réponses
Avatar
g.gourdin
Bonjour =E0 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"));=09
}

Le compilateur me sort:

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

Je ne vois pas o=F9 le probl=E8me: ifstream (et ofstream) d=E9rive bien de =
istream (de ostream).

Merci pour vos =E9clairages.

2 réponses

Avatar
Alain Ketterlin
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.
Avatar
James Kanze
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