我有一个问题不知道如何解决。
我想使用SWIG为这两个在同一文件中的类创建Java包装器:
如果我尝试像这样使用%template:
utilities.h:
template<class T>
class EncoderInterface
{
public:
virtual ~EncoderInterface()
{
}
virtual const cdap_rib::SerializedObject* encode(const T &object) = 0;
virtual T* decode(
const cdap_rib::SerializedObject &serialized_object) const = 0;
};
class IntEncoder : public rib::EncoderInterface<int>
{
public:
const cdap_rib::SerializedObject* encode(const int &object);
int* decode(const cdap_rib::SerializedObject &serialized_object) const;
};
然后我在.i中执行通常的swig操作:
%{
#include "utilities.h"
%}
%include "utilities.h"
并且它说:
Warning 401: Nothing known about base class 'EncoderInterface< int >'. Ignored.
Warning 401: Maybe you forgot to instantiate 'EncoderInterface< int >' using %template.
如果我尝试像这样使用%template:
%template(IntEncoder) EncoderInterface<int>;
Warning 302: Identifier 'IntEncoder' redefined (ignored) (Renamed from 'EncoderInterface< int >'),
utilities.h:302: Warning 302: previous definition of 'IntEncoder'.
IntEncoder
在utilities.cc中编写代码,我希望让使用该工具的用户创建新的模板实例或者使用给定的实例。我不想改变IntEncoder
的名称,这样库的任何用户(来自C++或Java)都可以使用相同的名称。
我了解到文件分割(将EncoderInterface
模板放在一个文件中,实例化放在另一个文件中)是解决此问题的唯一方法吗?如果可以避免,我不想创建新文件。