Struct不接受wchar_t

时间:2010-11-01 17:41:51

标签: c++ wchar-t

这是我唯一能想到的。事情是有感知的

我有一个结构如下:

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);
}

6 个答案:

答案 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 *指针。

请注意,您的结构仍然是可分配的,因为成员不是常量指针,它们是指向不可变数据的指针。