在 C++/CLI(CLR 控制台应用程序)中的列表或向量中键入 <String^>

Type <String^> in list or vector in C++/CLI (CLR Console Application)

即将使用 stl::list(或之前的 std::vector),我遇到了这个错误消息:

错误 C3699:“&&”:不能在类型 'System::String ^'

上使用此间接寻址

因为我对 C++/CLI 类 互操作性不是很有经验,每当我声明 std::list 或使用 push_back 或 emplace_back它。有什么问题,我该如何使用它?目前,我正在研究一本关于 CLR 应用程序的书(Julian Templeman 的 Microsoft Visual C++/CLI) 提前谢谢你的帮助。代码片段:

void Printout()
{
    String^ strcat(" ");
    String^ path("./somefile.txt");
    FileStream^ inf = gcnew FileStream(path, FileMode::Open, FileAccess::Read);
    list<String^> vect; // = gcnew list<String^>();
    list<String^>::iterator vectit;
    stringstream strst;
    while (strcat != "")
    {
        StreamReader^ sr = gcnew StreamReader(inf, Encoding::UTF8);
        String^ content = sr->ReadToEnd();
        Console::WriteLine(content);
        strcat += content;
        int preQomma = strcat->IndexOf(",");
        //int postQomma = strcat->IndexOf(",", preQomma + 1);
        //Console::WriteLine(strcat->Remove(preQomma, preQomma + 1));
        vect.push_back(strcat->Remove(preQomma, preQomma+1)); //bummer
        strcat = "";
    }
    strcat = "";
    for (vectit = vect.begin(); vectit != vect.end(); ++vectit)
    {
        strcat = strcat + " " + *vectit;
    }
    Console::WriteLine(strcat);
}

非托管 class 不能包含托管对象,至少不能不跳过您可能不想处理的环节。

不使用 std::liststd::vector,而是使用托管类型 List<String^>。由于 System::Collection::Generic::List 是托管类型,它可以包含托管 String^ 对象。

List<String^>^ mylist = gcnew List<String^>();

mylist->Add(strcat->Remove(preQomma, preQomma+1)); //bummer removed!

即是说,标准 warning/reminder:C++/CLI 用于互操作,提供中间层以允许 .Net 代码调用非托管 C++。虽然这当然是可能的,但您可能不想在 C++/CLI 中编写您的主要应用程序。通常,您可能希望使用 C# 编写应用程序,并使用 C++/CLI 进行互操作,其中 P/Invoke 是不够的。