Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Héritage entre istream et ifstream

16 views
Skip to first unread message

g.go...@gmail.com

unread,
Jul 13, 2012, 8:35:57 AM7/13/12
to
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.

Alain Ketterlin

unread,
Jul 13, 2012, 9:01:37 AM7/13/12
to
g.go...@gmail.com 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

-- Alain.

James Kanze

unread,
Jul 30, 2012, 7:04:54 PM7/30/12
to
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
0 new messages