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

instantiating a template class in CNI/C++ code

在过去的几个小时里,我一直在和 CNI 打交道,以便插入 Java 和 C++ 代码。

虽然我正在寻找使用 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 class)

只有当我删除类型参数规范时,它才允许我使用数据结构,就好像类型参数被选择为java.lang.ObjectCNI docs 似乎根本没有提到它!确实没有关于模板的字眼。

有人知道在 CNI 上下文中使用模板吗?支持吗?我在 googleWhosebug 中搜索了答案,但找不到丝毫线索。任何帮助将不胜感激。

另外,我想知道我使用的是不是 gcc 2.95.2(那个 gcc 版本有 gcj 吗?)

我正在 Virtual Boxed Ubunto 12 windows 10 主机上工作。 更重要的是 gcjgcc 版本基于 4.8.4 java --version 产生 1.5libgcj 4.8.4

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

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

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

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

CNI 做同样的事情。它实例化了 java.util.Stack 的唯一一个实现,它可以接受所有类型的对象。