我在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类接收项集合吗?
答案 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 ++中使用此方法,您必须将此集合转换为该特定语言的兼容集合。