命名空间问题
Problems with namespacing
我有以下问题。我正在尝试将代码从 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::Encoder< ipcp_config_t > *arg1 = (rinad::mad_manager::Encoder< ipcp_config_t > *) 0 ;
我已经尝试指定每个命名空间(即使没有必要),但它也不起作用。如果我在 librinad_java.cc
中手动添加命名空间 rinad::mad_manager::ipcp_config_t
它会起作用,所以问题是 SWIG 不会导出此命名空间。我不知道这是哪里的问题。
附带问题。我不得不将 common.h
中显示的代码与 encoders.h
中显示的代码分开,以便能够在 .i
模板实例化之前指定它 (encoders.h
) 但是在定义 ipcp_config_t
之后 (common.h
)。这是唯一的方法吗?
好的,这是一个答案。不做
typedef struct ipcp_config{
....
}ipcp_config_t;
但是
typedef struct{
....
}ipcp_config_t;
这对我有用,因为我不需要转发声明。如果需要声明(例如在递归结构中),我仍然不知道该怎么办
我有以下问题。我正在尝试将代码从 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::Encoder< ipcp_config_t > *arg1 = (rinad::mad_manager::Encoder< ipcp_config_t > *) 0 ;
我已经尝试指定每个命名空间(即使没有必要),但它也不起作用。如果我在 librinad_java.cc
中手动添加命名空间 rinad::mad_manager::ipcp_config_t
它会起作用,所以问题是 SWIG 不会导出此命名空间。我不知道这是哪里的问题。
附带问题。我不得不将 common.h
中显示的代码与 encoders.h
中显示的代码分开,以便能够在 .i
模板实例化之前指定它 (encoders.h
) 但是在定义 ipcp_config_t
之后 (common.h
)。这是唯一的方法吗?
好的,这是一个答案。不做
typedef struct ipcp_config{
....
}ipcp_config_t;
但是
typedef struct{
....
}ipcp_config_t;
这对我有用,因为我不需要转发声明。如果需要声明(例如在递归结构中),我仍然不知道该怎么办