Необходимо объединить std: string + WCHAR, перемещая код gcc в Visual C ++ 2010 - PullRequest
0 голосов
/ 12 июля 2011

Я не писал код ниже, он с открытым исходным кодом и больше не поддерживается. Мне нужно внести в него несколько изменений, чтобы я установил VC ++ Express 2010, и мне удалось решить большинство проблем, и приложение фактически было написано для Windows с самого начала, так как оно было утомительным, но достаточно сложным Я делаю успехи.

Я застрял на одном преобразовании и не совсем разбираюсь в преобразованиях типов VC ++ 2010, но вот код, дающий мне мою последнюю головную боль ...

путь - это std :: string, а cFileName - это WCHAR. Я считаю, что мне удалось преобразовать путь в WCHAR, но затем возникла проблема с mEntries.push_back. Мне кажется, мне нужно преобразовать cFileName в строку, и я искал и пробовал множество разных способов сделать это, но я либо неправильно понимаю синтаксис, либо он не работает в VC ++, либо я что-то упускаю.

Было бы неплохо узнать, почему это не работает и почему существует так много разных «типов» строк (я пишу сценарии SQL, это нелепо), но на данный момент мне просто нужна помощь, чтобы заставить его работать.

// Add files matching file spec to listing, returning number added. Each
// filename is prepended with its path, if one was supplied in file spec.

unsigned int DirList :: Add( const string & fspec ) {

// save path, if any
STRPOS lastslash = fspec.find_last_of( "\\/");
string path = lastslash == STRNPOS ? "" : fspec.substr( 0, lastslash + 1 );
unsigned int count = 0;
WIN32_FIND_DATA fd;
HANDLE h = FindFirstFile( LPCWSTR(fspec.c_str()), & fd );
if ( h == INVALID_HANDLE_VALUE ) {
    return count;
}

do {
    mEntries.push_back(
        new WinDirEntry(
                path + fd.cFileName,    // add path back on
                fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
        )
    );
    count++;
} while( FindNextFile( h, & fd ) );

FindClose( h );

return count;
}

Сообщение об ошибке:

error C2782: 'std::basic_string<_Elem,_Traits,_Alloc> std::operator +(std::basic_string<_Elem,_Traits,_Alloc> &&,const _Elem *)' : template parameter '_Elem' is ambiguous
1>          ...\microsoft visual studio 10.0\vc\include\string(143) : see declaration of 'std::operator +'
1>          could be 'WCHAR'
1>          or       'char'

error C2784: 'std::basic_string<_Elem,_Traits,_Alloc> std::operator +(std::basic_string<_Elem,_Traits,_Alloc> &&,std::basic_string<_Elem,_Traits,_Alloc> &&)' : could not deduce template argument for 'std::basic_string<_Elem,_Traits,_Alloc> &&' from 'WCHAR [260]'
1>   ...\microsoft visual studio 10.0\vc\include\string(109) : see declaration of 'std::operator +'

error C2676: binary '+' : 'std::string' does not define this operator or a conversion to a type acceptable to the predefined operator

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Преобразование path из std::string в std::wstring.

std::string s("hello");
std::wstring ws;

ws.assign(s.begin(), s.end());

Создайте std::wstring для cFileName, чтобы у вас были обе строки одного типа для работы.

ПРИМЕЧАНИЕ : метод assign() работает, только если вы собираетесь конвертировать из std::string в std::wstring.Наоборот, не работает должным образом для всех символов Юникода.Нашел этот раздел форума codeguru.com, в котором говорится о преобразовании между std::string и std::wstring: Как преобразовать строку в wstring?

Ссылка:

MSDN: std :: wstring

cplusplus.com: std :: string / std :: wstring

0 голосов
/ 12 июля 2011

Я считаю, что ваша проблема в том, что тип std :: string использует ваш базовый символ в качестве типа символа, а оператор + не определен для std :: basic_string и массива широких символов.Я думаю, что Visual Studio поддерживает std :: wstring, который может просто сделать эту работу, если его закинуть вместо std :: string.

И есть несколько различных типов строк, потому что есть много разных способов кодирования символов,ASCII, UTF-8 и т. Д., И т. Д. Не все из них вписываются в ваш базовый символ *, и вы не особо защищены от этого в C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...