Bonjour à tous.

je dois modifier un programme en C++, ma modification à pour objet de générer un fichier qui soit la copie de ce qui est affiché sur l'écran. Malheureusement, je n'y connais rien en C++ et je bute sur un message d'erreur.

Pour le moment, j'ai créer une classe qui permet de surcharger l'opérateur << pour afficher écrire à la fois sur la console et dans un fichier .

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
#ifndef MSTREAM_HPP_
#define MSTREAM_HPP_
 
#include <iostream>
#include <fstream>
 
class mstream
{
  public:
	std::ofstream coss;
	mstream(char * fileName);
	~mstream(void);
 
	template <class T> mstream& operator<< (T val) {
	  coss << val;
	  std::cout << val;
	  return *this;
	}
};
 
#endif /* MSTREAM_HPP_ */
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
#include <iostream>
#include "mstream.hpp"
using namespace std;
 
 
mstream::mstream(char * fileName)
{
	coss.open(fileName,ios::out);
	if (!coss.is_open()) {
	  std::cout << "Impossible d'ouvrir le fichier trace" << endl;
	}
}
 
mstream::~mstream(void)
{
	if (coss.is_open()) {
		coss.flush();
		coss.close();
	}
}
et un exemple d'utilisation

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
#include <iostream>
#include "mstream.hpp"
 
using namespace std;
 
int main(int argc, char * argv[])
{
	mstream * messageTracer = new mstream("titi.txt");
	cout << endl;
	*messageTracer << "c'est fini" << "\n";
	delete messageTracer;
}
Ici, pas de problème ; je peux afficher dans l'écran et dans un fichier un message. mais par contre, je peux pas utiliser le endl comme ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
*messageTracer << "c'est fini" << endl;

j'ai donc rajouté une nouvelle surcharge de l'opérateur comme ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
#ifndef MSTREAM_HPP_
#define MSTREAM_HPP_
 
#include <iostream>
#include <fstream>
 
class mstream
{
  public:
	std::ofstream coss;
	mstream(char * fileName);
	~mstream(void);
 
	template <class T> mstream& operator<< (T val) {
	  coss << val;
	  std::cout << val;
	  return *this;
	}
 
	// Pour la gestion du endl
	template <class T> mstream& operator<< (mstream& (*pfun)(mstream&)) {
	  pfun(coss);
	  pfun(std::cout);
	  return *this;
	}
};
 
#endif /* MSTREAM_HPP_ */
mais cela ne veut pas compiler, j'obtiens les messages suivants sous eclipse:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
In file included from ..\src\main.cpp:2:
..\src\mstream.hpp: In member function `mstream& mstream::operator<<(mstream&(*)(mstream&))':
..\src\mstream.hpp:29: error: invalid initialization of reference of type 'mstream&' from expression of type 'std::ofstream'
..\src\mstream.hpp:30: error: invalid initialization of reference of type 'mstream&' from expression of type 'std::ostream'
Qui peut me débloquer
merci