【发布时间】:2016-12-23 09:48:09
【问题描述】:
使用 marshal_cppstd.h 和 msclr::interop::marshal_as<> 我可以将托管字符串编组为 std::string,如下所示:
String^ managed = "test";
std::string unmanaged = marshal_as<std::string>(managed);
现在,当managed 是我正在编写代码的类的成员时,我在执行以下操作时会出错:
std::string unmanaged = marshal_as<std::string>(this->managed);
错误提示:
没有重载函数“marshal_as”的实例与参数列表匹配
或者编译器错误C2665:
'msclr::interop::marshal_as': 3 个重载都不能转换所有参数类型
当我更改代码以使用辅助变量时,它可以工作:
String^ localManaged = this->managed;
std::string unmanabed = marshal_as<std::string>(localManaged);
这里肯定有一些隐式转换,不是吗?为什么会发生这种情况以及如何使简单的单线工作?
【问题讨论】:
-
@LucasTrzesniewski 不确定这是否是编译器错误,此处记录了类似的观察结果:stackoverflow.com/questions/30529869/… 虽然我使用的是一个类,但这可能是相关的。
-
哦对了,我没有发现签名采用
System::String ^const &参数,而&阻止您使用对可移动对象的引用。绝对不是编译器错误,并且在给定方法签名的情况下完全有意义。所以,是的,给自己写一个带有System::String^参数的辅助方法。
标签: c++-cli