gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:40:38 25 4
gpt4 key购买 nike

在过去的几个小时里,我一直在使用 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 类)

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

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

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

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

最佳答案

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

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

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

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

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

关于java - 在 CNI/C++ 代码中实例化模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37174740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com