#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
}
};
使用VS2008编译时,此代码提供:
.\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 ^)'
但是当我将字段更改为属性时:
property System::String^ text;
然后这段代码编译没有错误。为什么呢?
答案 0 :(得分:6)
解决方法是制作这样的副本:
ref class Test {
System::String^ text;
void Method() {
System::String^ workaround = text;
std::string f = msclr::interop::marshal_as<std::string>(workaround);
}
};
答案 1 :(得分:5)
Bug,已在VS2010中修复。反馈项is here。
答案 2 :(得分:1)
我正在使用这个片段,声明一个新变量太杂乱了。然而,这也有效:
msclr::interop::marshal_as<std::string>(gcnew String(string_to_be_converted))
另一个适合我的选择是这个小模板。它不仅解决了这里讨论的错误,它还修复了另一个被marshal_as破坏的东西,即它不适用于nullptr输入。但实际上,对于nullptr System :: String,一个好的c ++转换将是.empty()std :: string()。这是模板:
template<typename ToType, typename FromType>
inline ToType frum_cast(FromType s)
{
if (s == nullptr)
return ToType();
return msclr::interop::marshal_as<ToType>(s);
}