Я использую Swig 1.4.1, чтобы обернуть некоторый код C ++ для проекта C#.
Рассмотрим следующий код, который находится в одном файле Foo.h .
#ifndef __Foo__
#define __Foo__
namespace Ogre
{
template<int foo, typename T> class FooBase
{
public:
int getFooBase() const
{
return 1;
}
};
struct FooSpecialized : public FooBase<4, double>
{
int getFooSpecialized() const
{
return 2;
}
};
class FooImpl : public FooSpecialized
{
public:
int getFooImpl() const
{
return 3;
}
};
}
#endif
Для этого я использую следующее в своем файле интерфейса Swig.
%include "Foo.h"
В результате я получаю доступ к методам getFooSpecialized()
и getFooImpl()
. Но getFooBase()
отсутствует.
Я получаю без предупреждений при компиляции моего файла интерфейса Swig.
Это можно легко увидеть, посмотрев созданные файлы C# , Существует один файл FooSpecialized.cs , который содержит
public class FooSpecialized : global::System.IDisposable {
...
public int getFooFooSpecialized() {
int ret = OgrePINVOKE.FooSpecialized_getFooFooSpecialized(swigCPtr);
if (OgrePINVOKE.SWIGPendingException.Pending) throw OgrePINVOKE.SWIGPendingException.Retrieve();
return ret;
}
}
и FooImpl.cs , который содержит
public class FooImpl : FooSpecialized {
...
public int getFooImpl() {
int ret = OgrePINVOKE.FooImpl_getFooImpl(swigCPtr);
if (OgrePINVOKE.SWIGPendingException.Pending) throw OgrePINVOKE.SWIGPendingException.Retrieve();
return ret;
}
}
Я пробовал %rename
и %template
пока, но это не работает. Я также читал о разделении файла, но это не вариант для меня, потому что это сторонний компонент, с которым я работаю.