Вы всегда можете вызывать функции со строковыми литералами, потому что компилятор автоматически преобразует их в значение соответствующего строкового типа.
Проблема здесь в том, что вы пытаетесь смешать компоненты .NET Framework (System::String
) со стандартным строковым типом C ++ (std::string
), и они просто не очень хорошо сочетаются. Функции .NET, которые принимают параметр типа System::String
, не записаны или перегружены для приема параметра типа std::string
. Если вы работаете с .NET Framework, то вы используете C ++ / CLI, и обычно ожидается, что вы будете использовать строковый тип .NET, а не строковый тип C ++.
Аналогично, стандартные функции C ++ ожидают std::string
и ничего не знают о строковом типе .NET Framework. Поэтому, если вы ожидаете вызова функций из стандартной библиотеки C ++, вам следует использовать ее строковый тип.
Строки в стиле C (char[]
) - это старый запасной вариант, который вы никогда не захотите использовать при написании кода на C ++. std::string
всегда лучший вариант, и он даже предоставляет метод c_str()
, который вы уже знаете, который будете использовать при вызове функции API, которая ожидает массив символов. Но, как и другие два строковых типа, этот также не является взаимно конвертируемым.
Одна особенно большая проблема, с которой вы столкнетесь, заключается в том, что типы std::string
и char[]
принимают только "узкие" (не Unicode) строки, тогда как тип .NET Framework System::String
работает только с широкими (Unicode) ) строки. Это добавляет еще один рывок в миксе, когда дело доходит до конверсии. Там нет никакого способа, которым это может быть так просто, как приведение.
Но это не значит, что невозможно конвертировать между типами. На MSDN есть полезный документ, в котором объясняется , как конвертировать строки в различные типы C ++ .
В итоге вы можете преобразовать строки в стиле C в System::String
, используя соответствующим образом перегруженный конструктор, который принимает char*
:
const char* cString = "Hello, World!";
System::String ^netString = gcnew System::String(cString);
Console::WriteLine(netString);
delete netString;
И затем, конечно, вы можете конвертировать из std::string
в System::String
, комбинируя описанный выше метод с методом c_str()
:
std::string stdString("Hello, World!");
System::String ^netString = gcnew System::String(stdString.c_str());
Console::WriteLine(netString);
delete netString;