在 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::list
或 std::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 是不够的。
即将使用 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::list
或 std::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 是不够的。