为了在最近几个小时内插入Java和C ++代码,我一直在和CNI搞混。
虽然我正在考虑使用Java集合替代缺少libstd
的旧团队,但我尝试创建一个java.util.Stack
对象并对其进行操作。
然而,编译器(gcc
和gcj
,可能是相同的)似乎在我无辜的头脑上发挥他的廉价技巧:
# 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上下文中使用模板?是否支持?我在google
和stackoverflow
搜索了答案,但无法提供最轻微的线索。任何帮助将不胜感激。
此外,我想知道我是否使用gcc 2.95.2(该gcc版本是否有gcj?)
我正在Virtual Boxed
Ubunto 12
主持windows 10
主持人。
更重要的是,gcj
和gcc
版本位于4.8.4
java --version
会产生1.5
和libgcj 4.8.4
答案 0 :(得分:1)
不是CNI用户,但这个用户的原因似乎很明显。
Java中的通用规范java.util.Stack<T>
只是一个编译时约束,它检查您是否添加了与T兼容的类型的对象。在内部,java.util.Stack
只有单个实现,它接受所有类型的{{1} } s(实际上,引用到所有类型的对象)。您甚至可以通过使用不安全的转换来欺骗编译器添加而不是T的实例。因此,Object
和java.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*>
的唯一一个可以接受所有类型对象的实现。