2010-12-03 35 views
6

Bu dizeBir wstring'e nasıl ekleyebilirim?

std::string class::something(char* input) { 
    std::string s(input); 
    s = "hai! " + s; 
    return s; 
} 

:: std ile çalışır Ama başarısız ben std :: wstring ile aynı şeyi yapmak nasıl

std::wstring class::something(wchar_t* input) { 
    std::wstring s(input); 
    s = "hai! " + s; 
    return s; 
} 

wstring Aynı şeyi denerseniz?

cevap

13

Burada sorun türleridir. böylece

s = "hai! " + s; 

aslında bir sorundur, (genellikle bir const char* olan) bir wstring bir dize değil, ama bir alıntı dize sabiti buna bağlıdır.

"hai! " değeri, const char* türünde değil, const wchar_t* türünde değil. const char* temel bir tür olduğu için, const char* ve wstring çalışan bir global operator+ arıyor. Ayrıca,(std::basic_string<T>, the template underyling type for both string and wstring (sırasıyla char ve wchar_t öğesinin tür parametresi kullanılarak), const wchar_t* ve wstring için bir tane bulabilir ve ek olarak operator+ (const T*& s1, const basic_string<T> s2) için şablon yöntemleri oluşturur.

Bu nedenle, yapmak gereken bir wstring "hai!": Bu nedenle

std::wstring class::something(wchar_t* input){ 
    std::wstring s(input); 
    s = L"hai! " + s; 
    return s; 
} 

Visual C++ ile sabit bir dizeye L önek, bu "uzun" olarak tanımlar ve bir wstring. wstringis actually basic_string<wchar_t>, C++ şablonlarının davranışı nedeniyle, basic_string<char>'dan (std::string) tamamen farklı bir tür olduğundan, ikisini birleştiremezsiniz. Bunun yerine (multi-byte için geniş için 1 ve 1) 2 kod versiyonlarını sahip

+0

"Değer" hai! msgstr "string std :: string ..." ifadesi yanlış bir ifadedir. Gerçek tip 'char const *' dır. "Visual C++ 'da bir dize sabitindeki L öneki," uzun "ve" wstring "olarak tanımlanır," üç şekilde de yanlıştır. İlk olarak, VC++ için spesifik değil. İkincisi, "geniş" değil, "uzun" olarak tanımlar. Üçüncü olarak, bir wstring değil, bir 'wchar_t const *'. –

+0

Oldukça doğru. Bunu siz yazarken ve cevabımı aynı anda düzenlerken farkettim. Ben bir wchar_t const *, sadece bir wchar_t const * değil bir const olduğunu düşündüm rağmen? Hangi ben yanlış olarak const yerine, ben sadece yanlış yanlış yerine sadece yanlış tür olduğunu, düzeltmek için tekrar düzenlemek istiyorum emin wchar_t *, const olarak yazdım. –

7

"hai!" Önekini uygulayarak bir karakter niteliği yerine geniş bir karakter değişmezi kullanırsınız. L.

-1

:

#ifdef _UNICODE 
    typedef std::wstring tstring; 
    typedef wchar_t tchar; 
# define TEXT(s) L##s 
#else 
    typedef std::string tstring; 
    typedef char tchar; 
# define TEXT(s) s 
#endif 

tstring class::something(tchar* input) 
{ 
    tstring s(input); 
    s = TEXT("hai! ") + s; 
    return s; 
} 

Bu engeller ne zaman derleyici dize kodlama derleyici seçeneklerini değiştirmek kod yeniden yazma zorunda.

+0

'typedef std :: wstream tstring; wstream wstring olmalı, değil mi? Ayrıca diziler için başka bir Makro eklemeniz tavsiye edilmez - VS TEXT'de zaten var, bu yüzden ATL/MFC gibi ortak kütüphaneler projede (veya daha sonra eklenir) kullanılıyorsa, bu bir derleyici uyarısı bile üretecektir. Templated bir işlevi öneriyorum. – Alex

İlgili konular