Voici ma problématique. J'ai une classe client qui ressemble à ceci :
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();
};
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
 
string client::firstname()
{
	return _firstname;
}
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
 
// 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*));
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
 
sqlite3_bind_text(stmt, 1, client.firstname().c_str(), client.firstname().size(), SQLITE_STATIC);
Mais aucune valeur n'est inscrite dans la BD.
Si je fais l'opération suivante, tout fonctionne :

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

À 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!