Пространство имен возвращаемого типа шаблона SWIG2 не обнаружено - PullRequest
0 голосов
/ 11 августа 2010

Я вливаюсь в Яву. Я пытаюсь заставить шаблонного члена func использовать некоторый шаблонный тип возвращаемого значения, которому я, конечно, должен дать имя (поскольку в противном случае SWIG не создал бы необходимый источник).

test.i похож на:

%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
}

При звонке:

swig -c++ -java -outdir mypack -package mypack test.i

mypack / ns / C.java выглядит так:

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);
  }

}

это нормально, но Ivec определен в mypack / Ivec.java, то есть в «глобальном» пакете, и поэтому компиляция исходного кода завершается неудачно. Как я могу заставить SWIG использовать полное имя Ivec!?

Я также пытался вставить Ivec в то же пространство имен, что и C, например:

%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>;
}

но это приводит к тому, что Ivec все еще находится в mypack, а mypack / ns / C.java теперь:

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);
  }

}

и теперь SWIG даже не узнает классного Ivec: (

Кто-нибудь испытывал подобные трудности и подсказывал мне?

B I G T H X БББ

1 Ответ

0 голосов
/ 12 августа 2010

К этому моменту я исправил первую версию, добавив

%typemap(javaimports) ns::C "
import mypack.Ivec;
"

right ...

[ ... ]
%nspace ns::C;
// ... here
namespace ns
{
[ ... ]

Теперь имя будет разрешено компилятором java.

Приветствие.

...