命名空间问题

时间:2015-09-22 16:29:06

标签: java c++ swig

我有以下问题。我试图将代码从C ++包装到java。

COMMON.H

namespace rinad {
namespace mad_manager {

template<class T>
class Encoder{
public:
    virtual ~Encoder(){}
    virtual void encode(const T &obj, ser_obj_t& serobj) = 0;
    virtual void decode(const ser_obj_t &serobj,
        T& des_obj) = 0;
};
typedef struct ipcp_config{
....
}ipcp_config_t;
}}

encoders.h

namespace rinad {
namespace mad_manager {
class IPCPConfigEncoder: public Encoder<ipcp_config_t> {
public:
    void encode (const ipcp_config_t &obj,
                ser_obj_t& ser_obj);
    void decode(const ser_obj_t &ser_obj,
        ipcp_config_t& obj);
    std::string get_type() const{ return "ipcp-config"; };
};
}}

librinad.i

%{
#include "common.h"
#include "encoders.h"
%}
%include "common.h"

%template(TempIPCPConfigEncoder) rinad::mad_manager::Encoder<rinad::mad_manager::ipcp_config_t>;

%include "encoders.h"

生成的.cc文件(swig <options> -o librinad_java.cc)不会考虑导致错误的某些命名空间。

librinad_java.cc:836:32:错误:未在此范围内声明'ipcp_config_t'    rinad :: mad_manager ::编码器和LT; ipcp_config_t&gt; * arg1 =(rinad :: mad_manager :: Encoder&lt; ipcp_config_t&gt; *)0;

我试图指定每个命名空间(即使没有必要),但它也不起作用。如果我在rinad::mad_manager::ipcp_config_t中手动添加名称空间librinad_java.cc,那么问题是SWIG不会导出此名称空间。我无法弄清楚这里的问题是什么。

附带问题。我必须将common.h中显示的代码与encoders.h中显示的代码分开才能在实例化.i之前在encoders.h模板中指定,但是定义ipcp_config_t后(common.h)。这是唯一的方法吗?

1 个答案:

答案 0 :(得分:0)

好的,这是一个答案。不要做

typedef struct ipcp_config{
....
}ipcp_config_t;

typedef struct{
....
}ipcp_config_t;

这对我有用,因为我不需要转发声明。如果需要声明,我仍然不知道该怎么做(例如在递归结构中)