2010-08-11 4 views
0

자바로 바쁩니다. 나는 템플리트 멤버 func을 얻으려고 노력하고 있는데, 템플릿 타입의 리턴 타입을 사용하고있다. 물론 이름을 붙여야한다. (그렇지 않으면 SWIG가 필요한 소스를 생성하지 않을 것이기 때문이다.)SWIG2 템플릿 반환 형식의 네임 스페이스가 검색되지 않았습니다.

테스트 테스트 같은 것입니다 : 괜찮하지만 Ivec 인

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

} 

:

%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 보인다 mypack/Ivec.java에 정의 된 'global'패키지에 있으므로 소스 컴파일이 실패합니다. Ivec의 정식 명칭을 사용하려면 어떻게해야합니까?

는 나는 또한 같은 C와 같은 네임 스페이스에 Ivec를 밀어 시도

:/C.java 지금

%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에있는 효과가있다 :

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

} 

지금 꿀꺽 꿀꺽 심지어 멋진 Ivec :(

아무도 비슷한 어려움을 경험하고 인식하고 나에게 몇 가지 힌트를 제공하지 않는 이유는 무엇입니까?

지금 15,

B I G T H X에게 BBB

답변

0

난 오른쪽 ...

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

이제 이름 자바 컴파일러에 의해 해결 될

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

를 추가하여 제 버전이 고정.

건배.

관련 문제