C++;CLI:cliext::vector<;T>;作为公共类函数的返回类型? 我在C++ CLI上有下一堂课: public ref class MyClass { public: MyClass(void); virtual bool Init(); cliext::vector<int>^ ListOfNumbers(); }; 公共引用类MyClass { 公众: MyClass(无效); 虚拟bool Init(); cliext::vector^listofNumber(); };
我想从公共函数中得到int的向量 以下是impl:C++;CLI:cliext::vector<;T>;作为公共类函数的返回类型? 我在C++ CLI上有下一堂课: public ref class MyClass { public: MyClass(void); virtual bool Init(); cliext::vector<int>^ ListOfNumbers(); }; 公共引用类MyClass { 公众: MyClass(无效); 虚拟bool Init(); cliext::vector^listofNumber(); };,vector,c++-cli,cliext,Vector,C++ Cli,Cliext,我想从公共函数中得到int的向量 以下是impl: cliext::vector<int>^ MyClass::ListOfNumbers() { cliext::vector<int>^ devs = gcnew cliext::vector<int>(); devs->push_back(1); return devs; } cliext::vector^MyClass::ListofNumber() { cliext::v
cliext::vector<int>^ MyClass::ListOfNumbers()
{
cliext::vector<int>^ devs = gcnew cliext::vector<int>();
devs->push_back(1);
return devs;
}
cliext::vector^MyClass::ListofNumber()
{
cliext::vector^devs=gcnew cliext::vector();
开发人员->推回(1);
返回开发人员;
}
我的问题是我得到了下一个警告:
警告C4677:“ListofNumber”:非私有成员的签名
包含程序集专用类型“cliext::vector”
有人能告诉我原因吗?我可以从公共函数C++ CLI类接收项目集合吗?< /P> < P>是的,可以返回集合。检查此链接
尽管您想在.NETFramework或本机C++中使用此方法,但必须将该集合转换为该特定语言的兼容集合。
< P>是,您可以返回集合。检查此链接尽管您想在.NETFramework或本机C++中使用此方法,但必须将该集合转换为该特定语言的兼容集合。实际上,我不知道,但是如果CLI <强>模板> /Stutt+StutoSoices是私有的,并且不能通过公共汇编接口公开,那么我不会感到惊讶。您知道,C++/CLI生成的模板类型在与其他.Net程序集对话时并没有真正的帮助,而“与其他.Net对话”正是C++/CLI的作用所在
“本地C++模板”(如果我可以调用它们)是可用的,并且可以从C++侧访问<强> > <>强>。CLR运行时不能对它们进行一般操作,因为编译器的C++部分不能为它们生成适当的类型描述。(*)
要创建.Net接口,请使用.Net BCL类型。使用泛型而不是模板。所以,看看像System.Collections.Generic.List
这样的类型。它们可以安全地公开在公共接口中。(**)
<>请记住,C++ +CLI是本机C++和.NET的<强>混合< /强>。您可以轻松访问这两个世界,但这两个世界并不真正喜欢混合;)
编辑:
(*)正如JochenKalmbach所提醒的,它适用于“本机”模板。微软已经准备了一个特殊的STL版本,它实现了一些核心集合接口,因此它的向量实际上实现了System.collection.Generic.IEnumerable
。此处的vector
仍受本机限制,不能通过asembly接口直接作为自身发布(如vector
)。但是,后一种类型(IEnumerable
)是完全正常的CLR类型,可以公开。因此,请尝试以下示例:
System::Collections:::Generic::ICollection<int>^ MyClass::ListOfNumbers()
{
cliext::vector<int>^ devs = gcnew cliext::vector<int>();
devs->push_back(1);
return devs;
}
System::Collections:::Generic::ICollection^MyClass::listofNumber()
{
cliext::vector^devs=gcnew cliext::vector();
开发人员->推回(1);
返回开发人员;
}
它可能会编译-但我没有检查。事实上,我不知道,但如果所有CLI模板实例化都是私有的,并且不能通过公共程序集接口公开,我也不会感到惊讶。您知道,C++/CLI生成的模板类型在与其他.Net程序集对话时并没有真正的帮助,而“与其他.Net对话”正是C++/CLI的作用所在
“本地C++模板”(如果我可以调用它们)是可用的,并且可以从C++侧访问<强> > <>强>。CLR运行时不能对它们进行一般操作,因为编译器的C++部分不能为它们生成适当的类型描述。(*)
要创建.Net接口,请使用.Net BCL类型。使用泛型而不是模板。所以,看看像System.Collections.Generic.List
这样的类型。它们可以安全地公开在公共接口中。(**)
<>请记住,C++ +CLI是本机C++和.NET的<强>混合< /强>。您可以轻松访问这两个世界,但这两个世界并不真正喜欢混合;)
编辑:
(*)正如JochenKalmbach所提醒的,它适用于“本机”模板。微软已经准备了一个特殊的STL版本,它实现了一些核心集合接口,因此它的向量实际上实现了System.collection.Generic.IEnumerable
。此处的vector
仍受本机限制,不能通过asembly接口直接作为自身发布(如vector
)。但是,后一种类型(IEnumerable
)是完全正常的CLR类型,可以公开。因此,请尝试以下示例:
System::Collections:::Generic::ICollection<int>^ MyClass::ListOfNumbers()
{
cliext::vector<int>^ devs = gcnew cliext::vector<int>();
devs->push_back(1);
return devs;
}
System::Collections:::Generic::ICollection^MyClass::listofNumber()
{
cliext::vector^devs=gcnew cliext::vector();
开发人员->推回(1);
返回开发人员;
}
它可能会编译,但我没有检查。cliext::vector不打算用于跨程序集边界。它只能在C++/CLI项目中使用。因此,在公共接口中添加一个“private:”并返回一个“IEnumerable”。cliext::vector不用于跨程序集边界。它只能在C++/CLI项目中使用。所以,添加一个“private:”并在公共界面中返回一个“IEnumerable”。似乎我应该使用系统中的列表,不要问这样愚蠢的问题……=)使用STL/CLR永远不会失败。是的,一定要使用列表
。似乎我应该使用系统中的列表,不要问这样愚蠢的问题…=)使用STL/CLR永远不会失败。是,请务必使用列表
。警告不能忽略。如果查看链接,必须将cliext类型声明为“private”(然后警告消失),并返回相应的.NET泛型类型……警告不能被忽略。如果查看链接,必须将cliext类型声明为“private”(然后是警告di)