1

这是我唯一能想到的。东西是有感觉的

我有一个结构如下:

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

编译器抱怨它无法将 a 转换const char *为 a wchar_t。很好,我改变 push_back 说

dict_.push_back( NumPair ( wchar_t("anfangen"), wchar_t("to begin, to start") ) );

编译器错误:找不到接受所有参数的 NumPair ctor。

什么。这。地狱。我尝试了完全重建,认为我的 VSC++10 搞砸了。不,你猜不是。

我究竟做错了什么?

代码

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

6 回答 6

5

有两个主要问题。

首先,字符串字面量 ofwchar_t写成类似L"blah blah"(注意L)。

第二,const正确性:声明你的正式论点,如wchar_t const* pFirst. 这允许直接使用文字作为实际参数。或任何const字符串。

干杯&hth.,

于 2010-11-01T17:45:29.033 回答
4

字符串必须以 L 开头才能是宽字符字符串文字,例如L"abcdefghijk",它的类型是const wchar_t*。没有 L 它是一个窄字符串,类型为const char*,所以错误是正确的;尝试将 a 强制转换const char*wchar_t*无效,因为您只是更改了指针的类型并丢失了const限定符(它对指向的数据没有任何作用)。此外,您的第二个示例是wchar_t从指针创建对象const char*,这可能也不是您想要的 - 您想要指针,而不仅仅是单个wchar_t对象。

这不是有感觉的,你只是不清楚你在做什么:)

于 2010-11-01T17:45:35.730 回答
3

尝试

dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) ); 

L 表示它是一个 unicode (wchar) 字符串。

于 2010-11-01T17:44:16.037 回答
3

A"string in quotes"chars 的数组。您无法将其转换为wchar_t不复制的数组。但是前面有一个 L,a是文字,它给你一个sL"string in quotes"数组。wchar_t你希望 L 在你的文字前面:

NumPair( L"anfangen", L"to begin, to start" )
于 2010-11-01T17:46:20.170 回答
2

要创建 wchar_t 字符的字符串,请使用L文字上的前缀。

dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) ); 

PS如果您没有创建比字符串长度大一号的对象字符串来容纳零终止符,那么您将遇到麻烦。您可以考虑使用std::wstring.

于 2010-11-01T17:45:10.490 回答
2

最有可能的是,忘记使用指针的方式并使用 std::wstring ,这是一个采用宽字符串的内置字符串类。

如果您总是要使用指向文字的指针,那么您应该使用 const wchar_t * 指针。

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

于 2010-11-01T18:12:26.080 回答