impossible de convertir de 'const char *' to 'char *' std::string::c_str
Cela donne l'erreur: impossible de convertir de 'const char *' to 'char *'.
class Mock
{
public:
...
static void func(char **result)
{
*result = (resultsI++)->c_str();
}
static std::vector<std::string> results;
static std::vector<std::string>::iterator resultsI;
};
std::vector<std::string> Mock::results;
std::vector<std::string>::iterator Mock::resultsI;
Comment puis-je valablement se débarrasser de cette erreur, sans changer l'interface de la fonction func? Le responsable de l'implémentation de cette interface:
void (func*)(char **result)
oublié d'utiliser const char** dans la signature. Je ne peux pas le changer.
Rappelez-vous ceci est un simulacre et je suis seulement utilisé pour mes tests unitaires.
J'imagine que vous aurez à copier au lieu d'utiliser
Vous peut (mais ne doit pas) dédaigné la constness (const_cast<char*>((resultsI++)->c_str());)
Ryan Guthrie: Pourquoi ne devrais-je pas le faire?
const est là pour votre propre protection. En jetant de loin, vous perdez cette protection.
c_str()
.Vous peut (mais ne doit pas) dédaigné la constness (const_cast<char*>((resultsI++)->c_str());)
Ryan Guthrie: Pourquoi ne devrais-je pas le faire?
const est là pour votre propre protection. En jetant de loin, vous perdez cette protection.
OriginalL'auteur Baz | 2012-11-16
Vous devez vous connecter pour publier un commentaire.
Essayer:
Bien que ce n'est pas garanti de fonctionner avant C++11, il est connu pour être OK sur la plupart ou tous les compilateurs.
Le danger est que si la fonction essaie de modifier la longueur de la chaîne, vous pourriez obtenir une méchante erreurs. Évolution des caractères individuels devrait être OK.
std::string
doit avoir son mémoire contigus?C'est correct. Bien que la plupart C++03 implémentations, je suis familier avec le fait de faire usage de stockage contigu, ce n'était pas garanti dans le C++03 Standard. Quand j'ai besoin de C++03 garanti contigious de stockage, j'utilise généralement
vector<char>
plutôt questring
la garantie a été ajouté à C++11 après une enquête auprès de tous les membres de la commission ont montré que leur
std::string
implémentations ont été conformes.J'ai utilisé
vector<char>
trop, cela dépend de la tâche. Parfois, il est grand et parfois ne pas avoir la chaîne méthodes rend fastidieux.Le danger ici est que toute modification à la chaîne d'origine, peuvent être la cause de déménagement et de leur n'est pas une garantie que c'est '\0' s'est arrêté ce qui peut être un problème si vous passer pour une C-fonction de Chaîne. Si je faisais quelque chose de dangereux, je tiens à faire qu'il est évident qu'il est dangereux. À l'aide d'un
const_cast<char*>((resultsI++)->c_str())
vous faire coller parce que nous savons que nous ne devrions pas utiliser const exprimés. De cette façon, vous savez que votre code est mauvais et ça colle.OriginalL'auteur Mark Ransom
Dans le code de test, et si vous êtes certains que l'utilisateur de l'interface n'est pas d'aller à la mutation de l'char*, vous pourriez peut-être utiliser un
const_cast
?Qui suppose que l'appelant n'a pas la propriété de la
char *
; si c'est le cas, alors vous devriez faire une copie.OriginalL'auteur Douglas Leeder
Si vous êtes absolument certain que la fonction d'interface ne sera pas modifier la chaîne, vous pouvez utiliser
pour supprimer
const
ness.Sinon, une autre option est de passer de l'utilisation de
std::vector<std::string>
àstd::vector<std::vector<char>>
mais vous aurez assurez-vous de correctement null mettre fin à la les chaînes.OriginalL'auteur Praetorian