我在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类?
其实,我不知道,但我不会感到惊讶,如果所有的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;
}
它可能会编译 - 但我不检查。
cliext ::矢量并非旨在翻过组件边界使用。 它只能在C ++ / CLI项目中使用。 因此,添加一个“私人”,并在公共接口返回“IEnumerable的”。
是的,你可以返回集合。 检查此链接
http://msdn.microsoft.com/en-us/library/bb385659.aspx
但如果你想使用.NET Framework或本机C这种方法++你有这个集合转换为特定语言的兼容集合。