Voici ma problématique. J'ai une classe client qui ressemble à ceci :
Et voici ce que fait la méthode qui retourne _firstname (c'est tout con) :
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 #include <string> using namespace std; class client { string _firstname; string _lastname; public: client(); client(string,string); ~client(); string firstname(); string lastname(); };
Mon souci vient du fait que je souhaite utiliser sqlite et une des méthodes (pour lier des paramètres à la requête) a cette signature :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 string client::firstname() { return _firstname; }
Dans ma grande naïveté, j'ai pensé qu'en exécutant le code suivant tout était bon (c_str() retourne un const char* vers le contenu de ma string):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 // le 3ième paramètre, const char*, est la valeur que je souhaite passer SQLITE_API int SQLITE_STDCALL sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));
Mais aucune valeur n'est inscrite dans la BD.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 sqlite3_bind_text(stmt, 1, client.firstname().c_str(), client.firstname().size(), SQLITE_STATIC);
Si je fais l'opération suivante, tout fonctionne :
Quelqu'un peut m'expliquer pourquoi je ne peux pas utiliser c_str() directement sur la valeur retournée par la méthode de ma classe?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 string buf = client.firstname(); sqlite3_bind_text(stmt, 1, buf.c_str(), client.firstname().size(), SQLITE_STATIC);
À noter, j'utilise Visual Studio 2012 (VC11). Lorsqu'un collègue compile et exécute le code (XCode sous OSX) tout fonctionne sans problème.
Est-ce que c'est un problème de compilateur qui ne prend pas en charge ce type d'opération de la façon que je croyais? C'est peut-être une fonctionnalité dans une version plus récente du standard...?
Merci beaucoup!
Partager