C ++ CLI:cliext :: vector <t>作为公共类函数的返回类型?</t>

时间:2014-02-10 09:54:06

标签: vector c++-cli cliext

我在C ++ CLI中有下一课:

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

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

我想从公共功能中找到int的vector。

这是impl:

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

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

  

警告C4677:'ListOfNumbers':非私人成员的签名   包含程序集私有类型'cliext :: vector&lt; _Value_t&gt;'

有人可以告诉我原因吗?我可以从公共函数C ++ CLI类接收项集合吗?

3 个答案:

答案 0 :(得分:3)

实际上,我不知道,但如果所有CLI 模板实例都是私有的并且无法通过公共程序集界面公开,我不会感到惊讶。你知道,C ++ / CLI生成的模板类型在与其他.Net程序集交谈时并没有什么帮助,而“与其他.Net交谈”就是C ++ / CLI的用途。

“Native C ++模板”if(我可以这样称呼它们)是可用的,并且可以从C ++端 访问。 CLR运行时通常无法对它们进行操作,因为编译器的C ++部分无法为这些生成适当的类型描述。 (*)

要创建.Net接口,请使用.Net BCL类型。使用泛型代替模板。所以,看看像System.Collections.Generic.List<>这样的类型。它们可以安全地暴露在公共接口中。 (**)

请记住,C ++ / CLI是本机C ++和.Net的混合。你可以轻松访问这两个世界,但这些世界真的不喜欢混合;)

编辑: (*)正如JochenKalmbach提醒的那样,它适用于“原生”模板。 Microsoft已经准备了一个特殊的STL版本来实现某些核心集合接口,因此它的vector实际上实现了System.Collection.Generic.IEnumerable。这里的vector仍受原生限制,不能直接通过装配界面本身(如vector<>)发布。但是,后一种类型(IEnumerable)是完全正常的CLR类型并且可以暴露。所以,试试例子:

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

它可能会编译 - 但我没有检查过。

答案 1 :(得分:2)

cliext :: vector不打算跨程序集边界使用。它只能在C ++ / CLI项目中使用。所以添加一个“private:”并在公共接口中返回一个“IEnumerable”。

答案 2 :(得分:0)

是的,你可以退回收藏。查看此链接

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

虽然如果要在.NET框架或Native C ++中使用此方法,您必须将此集合转换为该特定语言的兼容集合。