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(); };

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

我想从公共函数中得到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::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)