Pour un std::string
, vous ne pouvez ajouter d'autres std::string
s, texte ASCIIZ à une adresse spécifiée par une const char*
et individuelle char
-characters.
Pour concaténer d'autres types, vous pouvez:
utiliser un flux:
std :: ostringstream oss; oss < < < < a_uint < < "et obtenu" < < résultat; lancer std :: runtime_error (oss.str());
le convertir d'abord à une représentation de chaîne:
jet std :: runtime_error (std :: string ("nous avons fait ") + boost :: lexical_cast (a_uint) + " et obtenu" + boost :: lexical_cast (résultat));
Vous pourriez raisonnablement se demander pourquoi C++ ne fournit pas operator+(std::string&, X&)
pour X {short, int, long, long long, float, double, etc. court non signé}, ou même:
template <typename T>
std::string operator+(std::string& s, T& t)
{
std::ostringstream oss;
oss << t;
return s + oss.str();
}
Dans de nombreux cas, ce serait pratique. Mais les flux sont plus puissants car vous pouvez régler la largeur et le caractère de remplissage, la précision du point flottant, etc. En outre, char est le type entier de 8 bits, alors comment le compilateur peut-il ajouter un seul caractère avec cette valeur ASCII? 'A' pour 65), ou une représentation ASCII de la valeur numérique ASCII "65"? (Actuellement, il ne gère pas les ints, donc le traiter comme un seul ASCII char
n'est pas déroutant). Ou devrait-il fonctionner pour> = 16 bits mais pas 8? Cela rendrait impossible de redimensionner des variables de/vers des entiers 8 bits sans avoir à faire une analyse d'impact complexe pour voir quelles opérations de chaînes devaient être réécrites. Il est également recommandé de minimiser les dépendances: un pourcentage faible mais peut-être significatif d'unités de traduction utilisant la chaîne ne doit pas nécessairement inclure (et donc passer l'analyse syntaxique) (et par conséquent ostream), et en général les dépendances cycliques sont une "odeur de code" et frustration testabilité (la chaîne dépend de ostringstream dépend de la chaîne ...).
J'ai posté ceci parce qu'un ami m'a posé cette question. Je connaissais le correctif, mais pas la raison du message d'erreur. –