2016-05-11 4 views
0

Я обманывал CNI, чтобы интерполировать код Java и C++ за последние несколько часов.Создание экземпляра класса шаблона в коде CNI/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 docs, кажется, ничего не говорит об этом вообще! нет слов о шаблонах.

Кто-нибудь знает об использовании шаблонов в контексте CNI? это поддерживается? Я искал google и stackoverflow для ответов, но не мог прийти с малейшей подсказкой. Любая помощь будет оценена по достоинству.

Кроме того, я хотел бы знать, если я использую GCC 2.95.2 (есть ли GCJ для этой версии GCC?)

Я работаю над Virtual BoxedUbunto 12 над windows 10 хозяина. Что еще более важно gcj и gcc версии стоит на 4.8.4 java --version урожайности 1.5 и libgcj 4.8.4

ответ

1

Не пользователя CNI, но причина для этого, кажется, достаточно очевидно.

Общие технические условия java.util.Stack<T> в Java является лишь ограничение времени компиляции, которая проверяет, что вы добавляете объекты типа, совместимые с Т. Внутренне, java.util.Stack имеет только единственную реализацию, которая принимает все типы Object с (на самом деле, ссылок для всех типов объектов). Вы даже можете обмануть компилятор в дополнение к экземпляру T, используя небезопасные конверсии. Таким образом, java.util.Stack<String> и java.util.Stack<Date> одинаковы.

C++ - это другое. Активация одного и того же шаблона с разными аргументами создает разные несовместимые типы. Например, std::stack<int>, std::stack<int*> и std::stack<char> являются совершенно разными реализациями и имеют разный код. Механизм шаблона C++ - это надмножество java generics.

Если вы хотите получить Java-функциональность на C++, вы должны написать std::stack<void*>, даже если вы хотите хранить объекты определенного типа T. Преобразование типа в T должно выполняться вручную.

CNI делает то же самое. Он создает единственную реализацию java.util.Stack, которая может принимать все типы объектов.

+0

Да, это кажется очевидным после вашего объяснения. Наверное, я должен был придумать это сам. Благодарю. – Aviv