Salut à tous,

Je réapprends à programmer en C++ en lisant Penser en C++ et je bloque sur l’exercice 9 du chapitre 14 :
Héritez une classe StringVectorde vector<void*>et redéfinissez les fonctions membres push_back( )et operator[]pour accepter et produire des string*. Qu'est-ce qui arrive si vous essayez de push_back( )un void*?
Ce qui me pose problème c'est la redéfinition de operator[] ( Rien ne vous empêche de donner aussi vôtre avis sur le redéfinition de push_back, si nécessaire ): Je n'arrives pas à comprendre comment renvoyer une référence sur un std::string*

Voici mon code :
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
30
31
32
33
34
35
36
37
38
39
40
#include <vector>
#include <iostream>
 
class StringVector : public std::vector<void*> {
public:
	void push_back ( std::string* s );
	std::string*& operator [] ( size_type n );
};
 
void StringVector::push_back ( std::string* spt ) {
	std::vector<void*>::push_back ( static_cast<void*>(spt) );
}
 
std::string*& StringVector::operator [] ( size_type n ) {
	return (static_cast<std::string*>(this->vector<void*>::operator [] ( n )));
}
 
void main () {
	StringVector sv;
 
	//Test de push_back
	std::string* spt = new std::string ( "abc" );
	sv.push_back ( spt );
	spt = new std::string ( "def" );
	sv.push_back ( spt );
	spt = new std::string ( "ghi" );
	sv.push_back ( spt );
 
	std::cout << "iterator :" << std::endl;
	for ( StringVector::iterator it = sv.begin(); it != sv.end(); ++it )
		std::cout << (static_cast<std::string*>(*it))->data() << std::endl;
 
	//Test de operator []
	std::cout << "operator [] :" << std::endl;
	for ( unsigned int i = 0; i < sv.size(); ++i ) {
		std::cout << i << " = " << sv[i] << std::endl;
	}
 
	system ("pause");
}
et l'erreur de compilation ligne 15 :
error C2440: 'return'*: impossible de convertir de 'std::string *' en 'std::string *&'