Я дурачился с 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-классом)
Только когда я удалил спецификацию аргумента типа, он позволил мне использовать структуру данных, как если бы аргумент типа был выбран какjava.lang.Object
, CNI документы кажется, ничего об этом не упоминает! нет слов о шаблонах действительно.
Кто-нибудь знает об использовании шаблонов в контексте CNI? это поддерживается? я искал google
а также stackoverflow
для ответов, но не мог прийти с малейшей подсказкой. Любая помощь будет оценена.
Кроме того, я хотел бы знать, использую ли я gcc 2.95.2 (есть ли gcj для этой версии gcc?)
Я работаю над Virtual Boxed
Ubunto 12
над windows 10
хост.
Важнее gcj
а также gcc
версии стоит на 4.8.4
java --version
доходность 1.5
а также libgcj 4.8.4
Не пользователь CNI, но причина этого кажется достаточно очевидной.
Общая спецификация java.util.Stack<T>
в Java есть только ограничение времени компиляции, которое проверяет, что вы добавляете объекты типа, совместимого с T. Внутренне, java.util.Stack
имеет только одну реализацию, которая принимает все типы Object
с (на самом деле, Рекомендации на все типы объектов). Вы можете даже обмануть компилятор, чтобы он не добавлял экземпляр T с помощью небезопасных преобразований. Так, java.util.Stack<String>
а также java.util.Stack<Date>
одинаковы внутри.
С ++ отличается. Создание одного и того же шаблона с разными аргументами создает разные несовместимые типы. Например, std::stack<int>
, std::stack<int*>
а также std::stack<char>
совершенно разные реализации и имеют другой код. Механизм шаблонов C ++ — это расширенный набор обобщений java.
Если, например, вы хотите получить функциональность Java в C ++, вы должны написать std::stack<void*>
даже если вы хотите хранить объекты определенного типа T. Преобразование типа в T должно выполняться вручную.
CNI делает то же самое. Он создает единственную реализацию java.util.Stack
который может принимать все типы объектов.
Других решений пока нет …