2010-11-01 6 views
1

Это единственное, о чем я могу думать. Вещь разумно.Struct Not Accepting 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"))); 

Compiler ошибку: Не удается найти NumPair CTOR, который принимает все аргументы.

Что. . Ад. Я попробовал полную перестройку, думая, что мой VSC++ 10 работает. Нет, не надо.

Что я делаю неправильно?

КОД

т е р, назначение и скопировать конструкцию все глубокие копии 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

Вам не удалось, когда вы пытались управлять несколькими ресурсами за раз, а именно строкой. Мы уже решили эту проблему, это 'std :: wstring'. – GManNickG

+1

Вам нужно добавить еще один символ для нулевого терминатора, а также обработать уничтожение. Технически ваш код также не является безопасным для исключений, если второй новый не удается, поскольку первый из них никогда не будет удален (деструктор не будет вызываться). Лучше всего использовать std :: wstring. – CashCow

ответ

4

Строки должны начинаться с L, чтобы быть широко символьная строка литералов, например, L"abcdefghijk", который имеет тип const wchar_t*. Без L это узкосимвольная строка типа const char*, поэтому ошибка верна; попытка наложить const char* на wchar_t* не будет работать, потому что вы просто меняете тип указателя и теряете квалификатор const (он ничего не делает для заостренных данных). Кроме того, ваш второй пример создает wchar_t объектов из const char* указателей, которые, вероятно, не то, что вы хотите - вы хотите указатели, а не только один объект wchar_t.

Это не разумно, вы просто не ясно, что вы делаете :)

3

Попробуйте

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

The L обозначает это юникода (WCHAR) строка.

2

Чтобы создать строки символов wchar_t, используйте префикс L в литературе.

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

P.S. Если вы не создаете свои строки объектов, превышающие длину строки, чтобы разместить нулевой ограничитель, у вас будут проблемы. Вы можете использовать std::wstring.

5

Есть две основные проблемы.

Во-первых, строковый литерал wchar_t написан как L"blah blah" (обратите внимание на L).

Во-вторых, const Правильность: объявите свой официальный аргумент, как wchar_t const* pFirst. Это позволяет использовать литерал непосредственно в качестве фактического аргумента. Или любая строка const.

Приветствия & HTH.,

3

"string in quotes" является массивом char с. Вы не можете преобразовать это в массив из wchar_t без копирования. Но с L впереди, L"string in quotes" является буквальным, что дает вам массив из wchar_t s. Вы хотите, что L перед вашими литералов:

NumPair(L"anfangen", L"to begin, to start") 
2

Скорее всего, просто забыть о делать это так, как вы с указателями и использовать зЬй :: wstring, встроенный в строке класса, который принимает строки широких символов.

Если вы всегда будете использовать указатели для литералов, вы должны использовать указатели const wchar_t *.

Обратите внимание, что ваша структура по-прежнему будет назначаться, поскольку члены не являются постоянными указателями, они являются указателями на неизменные данные.

 Смежные вопросы

  • Нет связанных вопросов^_^