我已經完成了一些託管包裝處理包裝unmanged代碼用於託管,但沒有那麼多,以另一種方式。C++託管到非託管轉換
我正在運行一個實驗,使用託管代碼來查找目錄並將它們返回到std向量中。長話短說,我正在搞下面的例子,並注意到一個問題。
#include "Helper.h"
#include <msclr/marshal.h>
#include <msclr/marshal_cppstd.h>
using namespace msclr::interop;
using namespace System;
namespace CLIWrapper {
std::vector<std::string> Helper::GetDirs(const char* root)
{
std::vector<std::string> rval;
String^ path = gcnew System::String(root);
array<String^,1>^ dirs = System::IO::Directory::GetDirectories(path);
for (int i=0; i < dirs->Length; i++)
{
//this fails
std::string nativeString1(marshal_as<std::string>(dirs[i]));
//this fails as well
std::string nativeString2(marshal_as<std::string>((String^const)dirs[i]));
// this works
String ^mStr = dirs[i];
std::string nativeString(marshal_as<std::string>(mStr));
rval.push_back(nativeString);
}
return rval;
}
}
失敗的 'nativeString1' 和 'nativeString2' 是: 錯誤C2665: 'msclr ::互操作:: marshal_as':無3個重載可以轉換所有的參數類型
'nativeString2'如果您查看錯誤的詳細信息,則會使用const,因爲它在marshal_as的某個簽名中列出。
問題是爲什麼'nativeString1'轉換失敗,但'nativeString'的工作?我的眼睛只是拒絕注意?
在響應線程出現之前:是的,我意識到這不是「最佳」解決方案,它不是平臺獨立的,等等。我試圖專注於這個特定的錯誤。
託管代碼中的Const-correctness非常麻煩,CLR不管它。你的解決方法是一個體面的實用解決方案,額外的變量得到優化,所以沒有什麼可擔心的。 – 2014-09-03 18:26:12
這很有趣!我不知道這是因爲dirs [i]不是一個常量引用,而mStr是。這裏是germane函數的定義:'template <> inline std :: string marshal_as(System :: String^const&_from_obj)'。你可以嘗試創建一個不斷的參考,看看你是否有任何牽引力。 – 2014-09-03 18:47:14
是的,我最初是用「this works」一節中的const定義做的,但發現它不是必需的。字符串^ const mStr = dirs [i]; – user3228938 2014-09-03 20:26:55