Bonjour,
Je vous soumets un petit bout de code qui me laisse perplexe, je copie/colle le code, et je vous explique le problème !
L'objectif est d'obtenir une chaine (std::string) à partir de n'importe quel type. Code inspiré de la FAQ ( http://cpp.developpez.com/faq/cpp/?p...GS_convertform )
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 #include <sstream> #ifndef __CONVERT_H #define __CONVERT_H namespace util { class convert { public: template<typename T> static std::string to_string(const T & value) { std::ostringstream oss; oss << value; return oss.str(); } private: convert() {} }; } #endif // __CONVERT_H
Tel quel, le code compile.
Si maintenant je teste ma méthode avec le bout de code suivant, cela compile et fonctionne :
Par contre, initialement, ma méthode util::convert::to_string était légèrement différente, c'est à dire qu'elle retournait std::string& plutôt que std::string ! L'idée étant de retourner une référence, afin de faire l'économie d'un appel à un constructeur par copie et/ou un opérateur d'assignation !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int index=0; for(...) { ... index++; } std::string str_index = util::convert::to_string(index);
Lorsque je retourne une référence, à la fois ça compile... et ça ne compile pas
Je m'explique :
cas 1) si la ligne "std::string str_index = util::convert::to_string(index);" est mise en commentaires, ça compile !
cas 2) si la ligne n'est pas en commentaires, ça plante à la compilation !
Le message d'erreur est le suivant :
In file included from ../src/fenprincipale.cpp:1:0:
../src/convert.h: In static member function ‘static std::string& util::convert::to_string(const T&) [with T = int, std::string = std::basic_string<char>]’:
../src/fenprincipale.cpp:50:59: instantiated from here
../src/convert.h:15:28: erreur: invalid initialization of non-const reference of type ‘std::string& {aka std::basic_string<char>&}’ from an rvalue of type ‘std::basic_ostringstream<char>::__string_type {aka std::basic_string<char>}’
../src/convert.h:16:9: attention : contrôle a atteint la fin non void de la fonction [-Wreturn-type]
Cela n'a sans doute pas grande importance, mais je suis sous Linux (Ubuntu).
Avez-vous une idée ?
Partager