C ++ CLI:cliext ::矢量 作为公共类函数的返回类型?(C++ CLI: cli

2019-09-28 06:07发布

我在C ++ CLI下一类:

   public ref class MyClass
   {
        public:
           MyClass(void);
           virtual bool Init();

           cliext::vector<int>^ ListOfNumbers();
   };

我想从公共温控功能recive INT的载体。

这里是IMPL:

cliext::vector<int>^ MyClass::ListOfNumbers()
{
    cliext::vector<int>^ devs = gcnew cliext::vector<int>();
    devs->push_back(1);
    return devs;
}

我的问题是,我得到了下一个警告:

警告C4677:“ListOfNumbers”:非私有成员的签名包含组件私人类型“cliext ::矢量<_Value_t>”

有人能告诉我原因吗? 我无法接受的项目集合从公共职能C ++ CLI类?

Answer 1:

其实,我不知道,但我不会感到惊讶,如果所有的CLI 模板实例是私人,并通过公开征集接口不能够露出。 要知道,说话的其他.NET程序集时由C ++ / CLI中生成的模板类型是不是真的有帮助,“交谈其他.NET”正是C ++ / CLI是。

“原生C ++模板”如果(我可以那样称呼他们)是可用的和可访问只能从C ++侧。 CLR运行时无法在一般操作它们,作为C ++编译器的一部分是不能够产生用于这些适当的类型的描述。 (*)

为了创建.NET接口,使用.NET基础类库类型。 使用泛型代替模板。 所以,看类型,如System.Collections.Generic.List<> 他们可以放心地在公共接口暴露出来。 (**)

请记住,C ++ / CLI是本机C的净的混合物 ++和。 您可以轻松地访问两个世界,但世界上那些不喜欢被混合;)

编辑:(*)由于JochenKalmbach提醒,它适用于“本土”的模板。 微软已经准备实现一些核心集合接口的一个特殊版本的STL,因此它的vector实际实现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;
}

它可能会编译 - 但我不检查。



Answer 2:

cliext ::矢量并非旨在翻过组件边界使用。 它只能在C ++ / CLI项目中使用。 因此,添加一个“私人”,并在公共接口返回“IEnumerable的”。



Answer 3:

是的,你可以返回集合。 检查此链接

http://msdn.microsoft.com/en-us/library/bb385659.aspx

但如果你想使用.NET Framework或本机C这种方法++你有这个集合转换为特定语言的兼容集合。



文章来源: C++ CLI: cliext::vector as return type of public class function?