Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Строка в VC2008


Автор: Evgen24 6.1.2009, 22:00
    Сегодня поставил себе Visual Studio 2008 и сталкнулся с такой проблемой. Я пишу:

Код


void CEx1View::OnDraw(CDC* pDC)
{
    pDC->TextOut(0, 0, "привет");



а она мне отвечает:

microsoft visual studio 9.0\vc\myprojects\ex1\ex1\ex1view.cpp(50) : error C2664: 'BOOL CDC::TextOutW(int,int,const CString &)' : cannot convert parameter 3 from 'const char [14]' to 'const CString &'
1>        Reason: cannot convert from 'const char [14]' to 'const CString'

как же тут строку на экран вывести?

Автор: vinter 6.1.2009, 22:26
Код

pDC->TextOut(0, 0, CString( _T( "привет" ) ) );

Автор: Kallikanzarid 6.1.2009, 22:27
Это что-то странное. Либо МФЦ еще более хреновая библиотека, чем я думал, либо у тебя в настройках проставлен Юникод.

Автор: Evgen24 6.1.2009, 22:43
Что за Юникод? как его отключить?

Автор: Kallikanzarid 6.1.2009, 22:52
Раз не знаешь, значит включен smile Юникод - это, упрощенно, двухбайтовая кодировка с наборами символов для большинства языков мира. Тип символа для строк Юникода - wchar_t. Твоя программа не компилируется, потому что при включенном Юникоде класс CString переходит на со строк char* на wchar_t*.

Решение проблемы - вместо char* используй LPCTSTR и LPTSTR, вместо char - TCHAR, вместо "строковый литерал" - _T( "строковый литерал" ). Тогда программа будет работать и с Юникодом, и без. Явно вызывать конструктор, как в примере выше, необязательно.

Автор: vinter 6.1.2009, 23:09
Цитата(Kallikanzarid @  6.1.2009,  23:52 Найти цитируемый пост)
Явно вызывать конструктор, как в примере выше, необязательно.

нигде выше никаких явных конструкторов нет ;)

Автор: Kallikanzarid 7.1.2009, 08:22
А CString - это не?

Автор: vinter 7.1.2009, 09:54
нет, это преобразование типа - явное.

Автор: Kallikanzarid 7.1.2009, 10:06
Учи матчасть. Это явное создание объекта, а явное создание объекта подразумевает вызов конструктора. Если бы ты сделал reinterpret_cast<CString>, я бы с тобой согласился.

Автор: vinter 7.1.2009, 11:31
Цитата(Kallikanzarid @  7.1.2009,  11:06 Найти цитируемый пост)
Учи матчасть

могу тебе посоветовать тоже самое ;)
Цитата(Kallikanzarid @  7.1.2009,  11:06 Найти цитируемый пост)
а явное создание объекта подразумевает вызов конструктора

это называется преобразование типа, вызов конструктора тут следствие, а не причина.

Автор: Kallikanzarid 7.1.2009, 14:42
Притянуто за уши. Так можно любое создание объекта с параметрами назвать преобразованием типа.

Автор: vinter 7.1.2009, 14:52
это не притянуто за уши, это название конструкции языка. Споры вокруг этого бессмысленны, т.к эта конструкция означает приведение типа, а не явный вызов конструктора. Ты можешь спорить с этим сколько угодно, но в С++ оно значит, то, что значит и ничего более

Автор: mes 7.1.2009, 15:11
Kallikanzarid и vinter, Вы не о том спорите.
ИМХО, спор должен быть о необходимости явного преобразования в вышеупомяннутой конструкции. В чем лично я сильно сомнваюсь..

P.S. в терминах придерживаюсь позиции vinterа.

Автор: Evgen24 7.1.2009, 15:14
Охх, это что теперь чтобы в VS2008 строку в кавычках написать нужно постоянно тип преобразовывать? 

Автор: vinter 7.1.2009, 15:23
Цитата(Evgen24 @  7.1.2009,  16:14 Найти цитируемый пост)
Охх, это что теперь чтобы в VS2008 строку в кавычках написать нужно постоянно тип преобразовывать? 

нет, но так нагляднее

Автор: Evgen24 7.1.2009, 15:29
Цитата(vinter @  7.1.2009,  16:23 Найти цитируемый пост)
нет, но так нагляднее


так а как же обойтись без приведения типа?  smile 

Автор: vinter 7.1.2009, 15:50
в моем посту главное макрос _T(...), а не приведение типа, его можешь убрать. Этот макрос пустой при отсутсвии юникода и раскрывается в L если юникод включен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)