2016-05-11 10 views
0

ここ数時間、JavaとC++のコードを補間するためにCNIを使いこなしてきました。CNI/C++コードでテンプレートクラスをインスタンス化する

古いチームの代わりにJavaコレクションを使用する可能性があると私はlibstdが見つかりませんでしたが、java.util.Stackオブジェクトを作成して操作しようとしました。

# 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クラス)

しかし

、コンパイラ(gccgcjは、そのおそらく同じに)私の無実の心時に彼の安価なトリックを果たしているようです

型引数の指定を削除したときにのみ、型引数がjava.lang.Objectに選ばれたかのように、データ構造体を使用できます。 CNI docsには何も言及されていないようです!テンプレートについての言葉は確かにありません。

誰でもCNIコンテキストでテンプレートを使用することについて知っていますか?それはサポートされていますか?私は答えのためにgooglestackoverflowを検索しましたが、ちょっとした手がかりを得ることはできませんでした。どんな助けもありがとう。また

、私は(そのgccのバージョンのGCJがあるのでしょうか?)私はGCC 2.95.2を使用しているかどうかを知りたい

私はVirtual BoxedUbunto 12windows 10を介してホストに取り組んでいます。 さらに重要なgcjgccバージョンは4.8.4 java --version利回り1.5libgcj 4.8.4

答えて

1

ないCNIユーザーの上に立つが、この1の理由は十分に明らかであるように思われます。 Javaで

一般的な仕様java.util.Stack<T>は、あなたが内部T.と互換性のある型のオブジェクトを追加することを確認のみコンパイル時間の制約であるjava.util.Stackは、すべてのタイプにObject S(実際には、参照のすべてのタイプを受け入れるだけ単一の実装を持っていますのオブジェクト)。あなたは、安全ではない変換を使って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の唯一の実装をインスタンス化します。

+0

はい、あなたの説明の後には明らかです。私は自分自身でこれを考え出すべきだったと思う。ありがとう。 – Aviv

関連する問題