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 !
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 |
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 )
Tel quel, le code compile.
Si maintenant je teste ma méthode avec le bout de code suivant, cela compile et fonctionne :
1 2 3 4 5 6 7 8
|
int index=0;
for(...)
{
...
index++;
}
std::string str_index = util::convert::to_string(index); |
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 !
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