我尝试将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
答案 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
:
一种方法,不必担心释放任何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::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;
}
答案 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;
}