Bonjour, comment convertir un std::string en double? J'ai essayer avec un static_cast sans succès...
![]()
Bonjour, comment convertir un std::string en double? J'ai essayer avec un static_cast sans succès...
![]()
Ca fonctionne pas mon truc
En faisant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 template <class T> std::string Util::ToStr(const T & value) { std::ostringstream oss; oss << value; return oss.str(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 double offset = Util::ToStr(dialog->GetOffset().mb_str()); // retourne un const char*
cannot convert `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `double' in initialization
essaye de faire :
En faisant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template <class T> bool Util::ToStr(std::string & str, const T & value) { std::istringstream iss(str); return iss >> value != 0; }
toi, tu faisait un flux de sortie et non un flux d'entree!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 double offset = Util::ToStr(dialog->GetOffset().mb_str()); // retourne un const char*
Je fais maintenant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 double offset; Util::FromStrToAny(dialog->GetOffset().mb_str(), offset);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 template <class T> static bool FromStrToAny(const std::string&, T&) template<class T> bool FromStrToAny(const std::string & str, T & out ) { // créer un flux à partir de la chaîne donnée std::istringstream iss( str ); // tenter la conversion vers Dest return iss >> out != 0; }
Et au linkage ca plante en me disant:
[Linker error] undefined reference to `bool Util::FromStrToAny<double>(std::string const&, double&)'
est-ce normal que le ";" de ta declaration n'y soit pas???Envoyé par vdumont
ca plante sur l'utilisation ou la partie declaration?implemantation???
Ca plante sur le:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Util::FromStrToAny(dialog->GetOffset().mb_str(), offset);
je ne me souviens plus trop donc, es-tu sur que la reference inclus dans la fonction ne gene pas l'appel ou tu passes une valeur?? il ne faudrait pas un pointeur par hasard ???
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
oui, Laurent a raison...
Mais tout de même, c'est énervant de devoir mettre tout dans le même fichier pour que le linker fasse son boulot...
C'est vraiment le défault des template...![]()
Ce n'est pas le linker qui a un problème, c'est le compilateur. Comment peut-il générer le code s'il ne sait pas qu'il doit le générer dans une autre unité de compilation ?
Je comprend pas trop là... mes fonctions sont déjà tous dans un seul fichier .h donc je serais pas supposer avoir le problème ?!
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 /* Auteur: Vincent Dumont * Printemps 2006 */ #ifndef util_h #define util_h #include <string> #include <sstream> #include <exception> /************************** *CLASSE ConversionFailure* *************************/ class ConversionFailure: public std::exception { public: virtual const char* what() const throw() { return "Erreur: echec dans la conversion."; } }; /************************* * CLASSE Util * *************************/ class Util { public: Util(); ~Util(); template <class T> static std::string ToStr(const T &); // Convertir en string template <class T> static int ToInt(const T &) throw(ConversionFailure); // Convertir en entier, peut lancer des exceptions en cas d'échec du >> template <class T> static bool FromStrToAny(const std::string&, T&) throw(ConversionFailure); // Recoit un string et le converti en un type donné }; /* *************************** * * IMPLEMENTATION DE Util * * *************************** */ template <class T> std::string Util::ToStr(const T & value) { std::ostringstream oss; oss << value; return oss.str(); } template <class T> int Util::ToInt(const T & value) throw(ConversionFailure) { std::istringstream iss(value); int integer; if (!(iss >> integer)) throw ConversionFailure(); return integer; } template<class T> bool FromStrToAny(const std::string & str, T & out ) { std::istringstream iss( str ); // tenter output return iss >> out != 0; } #endif
Je suis capable d'utiliser mes autres fonctions, ya seulement FromStrToAny qui plante au link...
Dans l'implémentation, il n'y a pas les throw.
Une indication : le fait d'indiquer que les fonctions peuvent renvoyer seulement un throw de type ConversionFailure fait que le compilateur ajoute un bloc try catch autours de ta fonction, et si elle renvoie un jour autre chose, c'est directement le programme qui se termine.
En gros, les indications de throw sont à éviter.
Dah en effet c'étais le throw qui pausait problème. Étant donné qu'il y avait le throw dans la déclaration mais pas dans l'implémentation.
![]()
Partager