将String ^转换为std :: string(基本字符串) - >错误。我怎样才能解决这个问题?

时间:2009-04-22 04:39:46

标签: c++ string std

我尝试将String ^转换为基本字符串...但是在此代码之后我收到错误。它是什么意思,我该如何解决?我需要将基本字符串输入到类构造函数中。字符串^不起作用。

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 个答案:

答案 0 :(得分:8)

你需要编组你的字符串。托管字符串位于托管堆上的某处(垃圾收集器可以自由移动它)。

将字符串转换为本机的一种方法如下:

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,则可以利用更好的编组实用程序。 Check out this MSDN page

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

using namespace msclr::interop;

std::string nativeString(marshal_as<std::string>(managedString));

答案 1 :(得分:3)

我花了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 :(得分:2)

您需要做两件事才能将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 over ascii),但你可能不需要这个。

答案 3 :(得分:1)

可能是,您需要从std::stringString^进行逆转换。 我正在寻找这种转换,但我没有找到。所以,我写了它。我希望,这对某些人有用:

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

答案 4 :(得分:0)

我想你也可以这样做:

string dummy = string( textBox1->Text );

在MSDN上查看如何:Convert Between Various String Types

答案 5 :(得分:0)

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