Bonjour, comment convertir un std::string en double? J'ai essayer avec un static_cast sans succès...
:merci:
Version imprimable
Bonjour, comment convertir un std::string en double? J'ai essayer avec un static_cast sans succès...
:merci:
Ca fonctionne pas mon truc :(
En faisant:Code:
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:
1
2 double offset = Util::ToStr(dialog->GetOffset().mb_str()); // retourne un const char*
Citation:
cannot convert `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `double' in initialization
essaye de faire :
En faisant:Code:
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:
1
2 double offset = Util::ToStr(dialog->GetOffset().mb_str()); // retourne un const char*
Je fais maintenant
Code:
1
2
3 double offset; Util::FromStrToAny(dialog->GetOffset().mb_str(), offset);
Code:
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:
Citation:
[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???Citation:
Envoyé par vdumont
Erreur de copier/coller désolé. Il y est.
ca plante sur l'utilisation ou la partie declaration?implemantation???
Ca plante sur le:
Code:
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 ???
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... :aie:
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 ?
oui, au temps pour moi...:aie:
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:
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.
:merci: