Je suis en train de swigger vers Java. J'essaye d'obtenir une fonction membre modélisée pour utiliser un type de retour basé sur un modèle, que je dois donner un nom bien sûr (sinon SWIG ne créerait pas la source nécessaire).SWIG2 modèle de retour type espace de noms non détecté
test.i est comme:
%module Test
%{
#include <vector>
namespace ns
{
class C
{
public:
template <class T>
void doit(const std::vector<T>& v) {}; // will need std:vector<int> version of that
};
}
%}
%include "std_vector.i"
%template(Ivec) std::vector<int>; // here I'm defining an std::vector<int> to use ...
%nspace ns::C;
namespace ns
{
class C
{
public:
template <class T>
void doit(const std::vector<T>& v);
};
}
%extend ns::C
{
%template(Idoit) doit<int>; // ... here
}
Lorsque vous appelez:
swig -c++ -java -outdir mypack -package mypack test.i
mypack/ns/C.java ressemble:
package mypack.ns;
public class C {
private long swigCPtr;
protected boolean swigCMemOwn;
public C(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
public static long getCPtr(C obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr != 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
mypack.TestJNI.delete_ns_C(swigCPtr);
}
swigCPtr = 0;
}
}
public void Idoit(Ivec v) { // OK, Ivec is beeing used ... but not with its fqn
mypack.TestJNI.ns_C_Idoit(swigCPtr, this, Ivec.getCPtr(v), v);
}
public C() {
this(mypack.TestJNI.new_ns_C(), true);
}
}
ce qui est bien, mais Ivec est défini dans mypack/Ivec.java, c'est-à-dire dans le paquet 'global' et donc la compilation échoue. Comment puis-je faire en sorte que SWIG utilise le nom complet d'Ivec?
J'ai aussi essayé de pousser Ivec dans le même espace que C comme:
%module Test
%{
#include <vector>
namespace ns
{
class C
{
public:
template <class T>
void doit(const std::vector<T>& v) {}; // will need std:vector<int> version of that
};
}
%}
%include "std_vector.i"
%nspace ns::C;
%nspace ns::Ivec;
namespace ns
{
%template("ns.Ivec") std::vector<int>;
class C
{
public:
template <class T>
void doit(const std::vector<T>& v);
};
}
%extend ns::C
{
%template(Idoit) doit<int>;
}
mais qui a pour effet que Ivec est toujours situé dans mypack et mypack/ns/C.java est maintenant:
package mypack.ns;
public class C {
private long swigCPtr;
protected boolean swigCMemOwn;
public C(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
public static long getCPtr(C obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr != 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
mypack.TestJNI.delete_ns_C(swigCPtr);
}
swigCPtr = 0;
}
}
public void Idoit(SWIGTYPE_p_ns__std__vectorT_int_t v) { // aaaaaaaaah
mypack.TestJNI.ns_C_Idoit(swigCPtr, this, SWIGTYPE_p_ns__std__vectorT_int_t.getCPtr(v));
}
public C() {
this(mypack.TestJNI.new_ns_C(), true);
}
}
et maintenant SWIG ne reconnaît pas même la fraîcheur Ivec :(
Quelqu'un at-il éprouvé des difficultés semblables et me donner quelques indices?
B I G T H X bbb