2009-04-02 5 views
0

Salut à la compilation de ce code dans Visual Studio 2008 i l'erreur suivanteC2664 d'erreur lors de l'utilisation basic_string <wchar_t> abc ("bonjour") en vC++ 9.0

#include<iostream> 
#include<string> 
using namespace std; 
void main() 
{ 
    basic_string<wchar_t> abc("hello world"); 
    cout<<abc; 
    return; 
} 

erreur C2664: « std :: basic_string < _Elem, _Traits, _Ax> :: basic_string (std :: string_structure _Elem, _Traits, _Ax> :: _ Has_debug_it) ': impossible de convertir le paramètre 1 de' const char [12] 'en' std :: basic_string < _Elem, _Traits, _Ax> :: _ Has_debug_it '

erreur C2679: binaire' < < ': aucun opérateur trouvé qui prend un l'opérande droit de type 'std :: basic_string < _Elem, _Traits, _Ax>' (ou il n'y a pas de conversion acceptable)

Qu'est-ce que je fais de mal?

Quelqu'un peut-il m'aider à comprendre ce qui se passe derrière? Merci

Répondre

3

wchar_t spécifie les types de caractères larges. Par défaut, un pointeur char const d'une chaîne littérale n'est pas large, mais vous pouvez dire au compilateur de le traiter comme un tableau de caractères larges en le préfixant avec 'L'.

Il suffit donc de changer pour

basic_string<wchar_t> abc(L"hello world"); 
+0

merci beaucoup .. il a résolu mon problème! –

+0

Ceci n'aborde pas les deux erreurs. – dirkgently

3

Essayez:

erreur C2664:

basic_string<wchar_t> abc(L"hello world"); 

erreur C2679:

cout << abc.c_str(); 

(Depuis le compilateur c annot/ne fournira pas une surcharge appropriée pour chaque type créé par l'utilisateur. Cependant, puisqu'il est aussi un type standard à savoir wstring, je regardais les en-têtes appropriés et n'a trouvé aucune operator<< appropriée qui prend soit un string ou un wstring)

et utiliser int main, de sorte que vous avez.

int main(void) 
{   
    basic_string<wchar_t> abc(L"hello world"); 
    cout << abc.c_str() << endl; 
    return 0; 
} 

Cependant, vous devriez vraiment utiliser std::wstring au lieu de réinventer la roue.

+0

merci lot..it résolvait mon problème! –

2

Le problème est que vous mélangez le caractère large et (étroit?) Types de caractères.

Pour votre basic_string, utilisez:

// note the L"..." to make the literal wchar_t 
basic_string<wchar_t> abc(L"hello world"); 

// note that basic_string is no longer wchar_t 
basic_string<char> abc("hello world"); 

ou l'équivalent:

// wstring is just a typedef for basic_string<wchar_t> 
wstring abc(L"hello world"); 

// string is just a typedef for basic_string<char> 
string abc("hello world"); 

Et changer la sortie pour correspondre aussi:

cout << abc; // if abc is basic_string<char> 

wcout << abc; // if abc is basic_string<wchar_t> 
Questions connexes