这是我唯一能想到的。事情是有感知的。
我有一个结构如下:
struct NumPair
{
wchar_t *pFirst, *pSecond;
int count;
以ctor,副本分配和构造为
NumPair( wchar_t *pfirst, wchar_t *psecond, int count = 0)
NumPair( const NumPair& np )
NumPair& operator=( const NumPair& np )
这是我上一个问题的扩展,我在这个问题中要求一种方法来对包含特殊(德语)字符的字符指针进行排序,例如ü, ä, ö
。
解决方案似乎是使用宽字符类型,但编译器由于某种原因抛出了一百多个转换错误。
示例输入:
// dict_ is a container of NumPairs.
dict_.push_back( NumPair ( "anfangen", "to begin, to start" ) );
编译器抱怨它无法将const char *
转换为wchar_t
。很好,我改变了push_back来说
dict_.push_back( NumPair ( wchar_t("anfangen"), wchar_t("to begin, to start") ) );
编译器错误:找不到接受所有参数的NumPair ctor。
什么。的。地狱。我尝试了完整的重建,认为我的VSC ++ 10正在崩溃。不,猜不是。
我做错了什么?
CODE
ctor,赋值和复制构造都是wchar_t指针的深层副本,如下所示。
包括wchar.h。
NumPair( wchar_t *pfirst, wchar_t *psecond, int count = 0)
: count(count)
{
size_t s1, s2;
s1 = wcslen(pfirst);
s2 = wcslen(psecond);
pFirst = new wchar_t[s1];
pSecond = new wchar_t[s2];
wcscpy(pFirst, pfirst);
wcscpy(pSecond, psecond);
}
答案 0 :(得分:5)
有两个主要问题。
首先,wchar_t
的字符串文字写成{{1}}(注意L"blah blah"
)。
其次,L
正确性:声明你的正式论点,如const
。这允许直接使用文字作为实际参数。或任何wchar_t const* pFirst
字符串。
干杯&第h。,
答案 1 :(得分:4)
字符串必须以L开头为宽字符字符串文字,例如L"abcdefghijk"
,类型为const wchar_t*
。没有L它是一个类型为const char*
的窄字符串,所以错误是正确的;尝试将const char*
转换为wchar_t*
将无效,因为您只是更改指针的类型并丢失const
限定符(它对指向的数据没有任何作用) )。另外,您的第二个示例是从wchar_t
指针创建const char*
个对象,这可能不是您想要的 - 您需要指针,而不仅仅是单个wchar_t
对象。
这不是有感知的,你只是不清楚你在做什么:)
答案 2 :(得分:3)
尝试
dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) );
L表示它是一个unicode(wchar)字符串。
答案 3 :(得分:3)
"string in quotes"
是一个char
的数组。如果不复制,则无法将其转换为wchar_t
数组。但是在前面有一个L,L"string in quotes"
是文字,它会为您提供一个wchar_t
数组。你想在你的文字前面加上L:
NumPair( L"anfangen", L"to begin, to start" )
答案 4 :(得分:2)
要创建wchar_t字符的字符串,请在文字上使用L
前缀。
dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) );
P.S。如果你没有创建一个大于字符串长度的对象字符串来容纳零终止符,那么你将遇到麻烦。您可以考虑使用std::wstring
。
答案 5 :(得分:2)
最有可能的,就是忘记按照指针的方式进行操作,并使用std :: wstring,这是一个带有宽字符串的内置字符串类。
如果你总是要使用指向文字的指针,那么你应该使用const wchar_t *指针。
请注意,您的结构仍然是可分配的,因为成员不是常量指针,它们是指向不可变数据的指针。