在CNI / C ++代码中实例化模板类

时间:2016-05-11 23:11:48

标签: java c++ gcc gcj

为了在最近几个小时内插入Java和C ++代码,我一直在和CNI搞混。

虽然我正在考虑使用Java集合替代缺少libstd的旧团队,但我尝试创建一个java.util.Stack对象并对其进行操作。

然而,编译器(gccgcj,可能是相同的)似乎在我无辜的头脑上发挥他的廉价技巧:

# gcc -g -I. test.cc
test.cc: In function ‘int main(int, char**)’:
test.cc:24:3: error: ‘java::util::Stack’ is not a template
   Stack<Person> *stack = new Stack<Person>();
   ^
test.cc:24:30: error: ‘java::util::Stack’ is not a template
   Stack<Person> *stack = new Stack<Person>();

(Person对象是定义良好的java类)

只有当我删除了类型参数规范时,它才允许我使用数据结构,就好像类型参数被选为java.lang.Object一样。 CNI docs似乎根本没有提到它!没有关于模板的话。

有没有人知道在CNI上下文中使用模板?是否支持?我在googlestackoverflow搜索了答案,但无法提供最轻微的线索。任何帮助将不胜感激。

此外,我想知道我是否使用gcc 2.95.2(该gcc版本是否有gcj?)

我正在Virtual Boxed Ubunto 12主持windows 10主持人。 更重要的是,gcjgcc版本位于4.8.4 java --version会产生1.5libgcj 4.8.4

1 个答案:

答案 0 :(得分:1)

不是CNI用户,但这个用户的原因似乎很明显。

Java中的通用规范java.util.Stack<T>只是一个编译时约束,它检查您是否添加了与T兼容的类型的对象。在内部,java.util.Stack只有单个实现,它接受所有类型的{{1} } s(实际上,引用到所有类型的对象)。您甚至可以通过使用不安全的转换来欺骗编译器添加而不是T的实例。因此,Objectjava.util.Stack<String>在内部是相同的。

C ++与众不同。使用不同参数实例化相同模板会创建不同的不兼容类型。例如,java.util.Stack<Date>std::stack<int>std::stack<int*>是完全不同的实现,并且具有不同的代码。 C ++模板机制是java泛型的超集。

例如,如果您希望在C ++中获得Java功能,即使您想要存储某些特定类型T的对象,也可以编写std::stack<char>。类型转换为T必须手动完成。

CNI做同样的事情。它实例化std::stack<void*>的唯一一个可以接受所有类型对象的实现。