Marshal_as Rows and Fields Compared to Properties
include "stdafx.h"
#include <string>
#include <msclr/marshal_cppstd.h>
ref class Test {
System::String^ text;
void Method() {
std::string f = msclr::interop::marshal_as<std::string>(text); // line 8
}
};
This code when compiling with VS2008 gives:
.\test.cpp(8) : error C2665: 'msclr::interop::marshal_as' : none of the 3 overloads could convert all the argument types
f:\programy\vs9\vc\include\msclr\marshal.h(153): could be '_To_Type msclr::interop::marshal_as<std::string>(const char [])'
with
[
_To_Type=std::string
]
f:\programy\vs9\vc\include\msclr\marshal.h(160): or '_To_Type msclr::interop::marshal_as<std::string>(const wchar_t [])'
with
[
_To_Type=std::string
]
f:\Programy\VS9\VC\include\msclr/marshal_cppstd.h(35): or 'std::string msclr::interop::marshal_as<std::string,System::String^>(System::String ^const &)'
while trying to match the argument list '(System::String ^)'
But when I change the field in the property:
property System::String^ text;
then this code compiles without errors. Why?
, , . :
msclr::interop::marshal_as<std::string>(gcnew String(string_to_be_converted))
Another option that works for me is this small template. It not only solves the problem discussed here, but also fixes another thing that broke with marshal_as, namely that it does not work for nullptr input. But a really good C ++ translation for nullptr System :: String would be .empty () std :: string (). Here is the template:
template<typename ToType, typename FromType>
inline ToType frum_cast(FromType s)
{
if (s == nullptr)
return ToType();
return msclr::interop::marshal_as<ToType>(s);
}