создание экземпляра класса шаблона в коде CNI / C ++

Я дурачился с 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

0

Решение

Не пользователь 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 который может принимать все типы объектов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]