J'ai supposé que std :: wstring et std :: string fournissaient plus ou moins la même interface.L'affectation d'un "const char *" à std :: string est autorisée, mais l'affectation à std :: wstring n'est pas compilée. Pourquoi?
J'ai donc essayé de permettre aux capacités unicode pour notre application
# ifdef APP_USE_UNICODE
typedef std::wstring AppStringType;
# else
typedef std::string AppStringType;
# endif
Cependant cela me donne beaucoup d'erreurs de compilation lors -DAPP_USE_UNICODE est utilisé.
Il s'est avéré que le compilateur étouffe lorsqu'un const char[]
est affecté à std::wstring
.
EDIT: exemple amélioré en supprimant l'utilisation du littéral "bonjour".
#include <string>
void myfunc(const char h[]) {
string s = h; // compiles OK
wstring w = h; // compile Error
}
Pourquoi cela fait-il une telle différence?
L'attribution d'un const char*
à std::string
est autorisée, mais l'affectation à std::wstring
génère des erreurs de compilation.
Est-ce que std::wstring
ne devrait pas fournir la même interface que std::string
? Au moins pour une opération aussi simple que l'affectation?
(environnement: gcc-4.4.1 sur Ubuntu Karmic 32bit)
Une bonne façon de gérer cela est comme l'API win32 et d'écrire une macro TEXT qui laisse la chaîne telle quelle ou ajoute le L en utilisant le jeton de macro ##. Donc, vous pouvez écrire TEXT ("bonjour") et la macro s'étendrait à la forme correcte. –