Преобразование строки ^ в std :: string (базовая строка) -> ошибка. Как я могу это исправить? - PullRequest
2 голосов
/ 22 апреля 2009

Я пытаюсь преобразовать строку ^ в базовую строку ... но я получаю сообщение об ошибке после этого кода. Что это значит и как я могу это исправить? Мне нужно ввести базовую строку в конструктор класса. Строка ^ не будет работать.

System::String^ temp = textBox1->Text;
string dummy = System::Convert::ToString(temp);
error C2440: 'initializing' : cannot convert from 'System::String ^' to 'std::basic_string'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits,
1>            _Ax=std::allocator
1>        ]
1>        No constructor could take the source type, or constructor overload resolution was ambiguous

Ответы [ 6 ]

8 голосов
/ 22 апреля 2009

Тебе нужно собрать свою строку. Управляемая строка находится где-то в управляемой куче (сборщик мусора может свободно перемещать ее).

Один из способов передачи строки на нативную сторону заключается в следующем:

using System::Runtime::InteropServices::Marshal;

char *pString = (char*)Marshal::StringToHGlobalAnsi(managedString);
std::string nativeString(pString); // make your std::string
Marshal::FreeHGlobal(pString);     // don't forget to clean up

Если вы используете Visual Studio 2008, вы можете воспользоваться гораздо более приятными утилитами для маршалинга. Проверьте эту страницу MSDN .

#include <msclr/marshal.h>
#include <msclr/marshal_cppstd.h>

using namespace msclr::interop;

std::string nativeString(marshal_as<std::string>(managedString));
3 голосов
/ 12 декабря 2010

Я трачу 11 часов, чтобы найти решение:

 #include <stdlib.h
 #include <string.h>
 #include <msclr\marshal_cppstd.h>
 //ListaQuad<int> prueba;
 //..
 using namespace msclr::interop;
 //..
 System::String^ clrString = (TextoDeBoton);
 std::string stdString = marshal_as<std::string>(clrString);  //String^ to std
 //System::String^ myString = marshal_as<System::String^>(MyBasicStirng);   //std to String^ (no lo he probado, pero sería algo así.)
 prueba.CopyInfo(stdString); //MyMethod
 //..
 //where, String^ = TextoDeBoton;
 //and, stdString = normal string;
2 голосов
/ 22 апреля 2009

Вам нужно сделать две вещи, чтобы преобразовать System::String в std::string:

  • Маршал памяти из управляемой кучи неуправляемой.
  • Преобразуйте кодировку символов из широких символов в (как выглядит из вашего вопроса) в символы ANSI.

Одним из способов, не беспокоясь об освобождении памяти HGlobal, является определение метода в соответствии с:

interior_ptr<unsigned char> GetAsciiString(System::String ^s)
{
    array<unsigned char> ^chars = System::Text::Encoding::ASCII->GetBytes(s);
    return &chars[0];
    // of course you'd want to do some error checking for string length, nulls, etc..
}

И вы бы использовали это как:

// somewhere else...
{
    pin_ptr<unsigned char> pChars = GetAsciiString(textBox1->Text);
    std:string std_str(pChars); // I don't have my compiler in front of me, so you may need a (char*)pChars
}

Это также позволяет вам использовать кодировку по вашему выбору (например, utf-8 вместо ascii), но вам это может не понадобиться.

1 голос
/ 24 октября 2014

Возможно, вам потребуется обратное преобразование от std::string до String^. Я искал это преобразование, но я не нашел. Итак, я написал это. Надеюсь, кому-нибудь это пригодится:

String^ stdStringToPlatformString(string stdString){
    const size_t newsizew = strlen(stdString.c_str()) + 1;
    size_t convertedChars = 0;
    wchar_t *ch1 = new wchar_t[newsizew];
    mbstowcs_s(&convertedChars, ch1, newsizew, stdString.c_str(), _TRUNCATE);
    String ^platformString;
    platformString = ref new Platform::String(ch1, newsizew);
    return platformString;
}    
0 голосов
/ 12 марта 2013
string platformStringToStdString(String ^input){
    int size=input->Length()+1;
    char* auxiliary=(char *)malloc(sizeof(char)*size);
    wcstombs_s(NULL,auxiliary,size,input->Data(),_TRUNCATE);
    string result(auxiliary);
    free(auxiliary);
    return result;
}
0 голосов
/ 22 апреля 2009

Я думаю, вы также можете просто сделать:

string dummy = string( textBox1->Text );

Ознакомьтесь с тем, как: Преобразовать между различными типами строк в MSDN.

...