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 ???
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