在 CNI/C++ 代码中实例化模板 class
instantiating a template class in CNI/C++ code
在过去的几个小时里,我一直在和 CNI 打交道,以便插入 Java 和 C++ 代码。
虽然我正在寻找使用 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 class)
只有当我删除类型参数规范时,它才允许我使用数据结构,就好像类型参数被选择为java.lang.Object
。 CNI docs 似乎根本没有提到它!确实没有关于模板的字眼。
有人知道在 CNI 上下文中使用模板吗?支持吗?我在 google
和 Whosebug
中搜索了答案,但找不到丝毫线索。任何帮助将不胜感激。
另外,我想知道我使用的是不是 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
不是 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
的唯一一个实现,它可以接受所有类型的对象。
在过去的几个小时里,我一直在和 CNI 打交道,以便插入 Java 和 C++ 代码。
虽然我正在寻找使用 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 class)
只有当我删除类型参数规范时,它才允许我使用数据结构,就好像类型参数被选择为java.lang.Object
。 CNI docs 似乎根本没有提到它!确实没有关于模板的字眼。
有人知道在 CNI 上下文中使用模板吗?支持吗?我在 google
和 Whosebug
中搜索了答案,但找不到丝毫线索。任何帮助将不胜感激。
另外,我想知道我使用的是不是 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
不是 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
的唯一一个实现,它可以接受所有类型的对象。