我在命名空间external :: internal
中有模板类BaseMyPoint它实现公共方法X(),Y(),Z()和SetCoord()。
然后写
typedef internal :: BaseMyPoint MyPointd;
创建派生类MyPoint,它使用public
继承MyPointd两个类的描述都存储在文件" myPoint.h":
中#pragma once
#ifdef MYPOINTSDLL_EXPORTS
#define MYPOINTSDLL_API __declspec(dllexport)
#else
#define MYPOINTSDLL_API __declspec(dllimport)
#endif
namespace external {
namespace internal {
template<typename T>
struct MyPointTraits;
template<>
struct MyPointTraits<double>
{
typedef double ValueType;
static ValueType CoincidenceTolerance() { return 1e-7; }
};
template<>
struct MyPointTraits<float>
{
typedef float ValueType;
static ValueType CoincidenceTolerance() { return 1e-7f; }
};
template<typename T>
class BaseMyPoint
{
public:
T myX;
T myY;
T myZ;
typedef typename MyPointTraits<T>::ValueType ValueType;
BaseMyPoint() {}
BaseMyPoint(ValueType theX, ValueType theY, ValueType theZ) :
myX(theX), myY(theY), myZ(theZ) {}
BaseMyPoint(const BaseMyPoint& theOther) :
myX(theOther.myX), myY(theOther.myY), myZ(theOther.myZ) {}
ValueType X() const { return myX; }
ValueType& X() { return myX; }
ValueType Y() const { return myY; }
ValueType& Y() { return myY; }
ValueType Z() const { return myZ; }
ValueType& Z() { return myZ; }
void SetCoord(ValueType theX, ValueType theY, ValueType theZ)
{
X() = theX;
Y() = theY;
Z() = theZ;
}
};
}
typedef internal::BaseMyPoint<double> MyPointd;
typedef internal::BaseMyPoint<float> MyPointf;
class MyPoint : public MyPointd
{
public:
MyPoint() {}
MyPoint(const MyPointd& theOther) : MyPointd(theOther) {}
};
}
写入界面文件&#34; myPoint.i&#34;:
%module myPointsWrapper
%{
#include "myPoint.h"
using namespace external;
using namespace external::internal;
%}
%include <windows.i>
%include "myPoint.h"
在命令行中我写道: C:\ swig -csharp -c ++ -namespace pointspase -outdir C:\ myPoints \ myPointcs \ Generated myPoint.i
在C#中,我们通过一个实例MyPoint aPoint引用这些方法(X(),Y(),Z(),SetCoord()):
using System;
using pointspase;
namespace myPointcs
{
class Program
{
static void Main(string[] args)
{
MyPoint aPoint = new MyPoint();
double x = 0.2, y = 0.3, z = 0.4;
aPoint.SetCoord(x, y, z);
double X = aPoint.X(), Y = aPoint.Y(), Z = aPoint.Z();
}
}
}
我有
错误CS1061&#39; MyPoint&#39;不包含&#39; Z&#39;的定义没有推广方法&#39; Z&#39;接受第一个 类型&#39; MyPoint&#39;的论点可以找到(你错过了使用指令或程序集引用吗?)
错误CS1061&#39; MyPoint&#39;不包含&#39; Y&#39;的定义没有延伸方法&#39; Y&#39;接受第一个 类型&#39; MyPoint&#39;的论点可以找到(你错过了使用指令或程序集引用吗?)
错误CS1061&#39; MyPoint&#39;不包含&#39; X&#39;的定义没有扩展方法&#39; X&#39;接受第一个 类型&#39; MyPoint&#39;的论点可以找到(你错过了使用指令或程序集引用吗?)
错误CS1061&#39; MyPoint&#39;不包含&#39; SetCoord&#39;的定义没有扩展方法&#39; SetCoord&#39; 接受类型&#39; MyPoint&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)
如何在C#类MyPoint中使这些方法可用?
提前感谢您的关注, 基里尔
编辑1
这是一个清楚表达我问题的简单例子。
&#34; file.h&#34;我写了
template <typename T>
class myclass {
public:
T get() const { return 0; }
};
class myintclass : public myclass<int> {};
在&#34; file.i&#34;我写了
%template (myclassi) myclass<int>
当我编译接口文件时,我有警告:
warning 401: Base class 'myclass< int >' undefined.
warning 401: 'myclass< int >' must be defined before it is used as a base class.
因此,C#类myintclass不包含方法get()。 如何更改接口文件以使get()方法可以从myintclass类中获得?
答案 0 :(得分:1)
在编辑中给出file.h
,正确声明所有内容有点棘手。理想情况下,模板应该位于与myintclass
定义不同的标题中,但这是一种经过测试的方法:
%module test
%{
#include "file.h"
%}
// Process the template first
template <typename T>
class myclass {
public:
T get() const { return 0; }
};
// Tell SWIG to generate code for a template instance.
%template(myclassi) myclass<int>;
// Now that SWIG has code for the template instance,
// SWIG can generate code for classes using the template instance.
class myintclass : public myclass<int> {};
测试模块(我为Python生成):
>>> import test
>>> t=test.myclassi()
>>> t.get()
0
>>> t=test.myintclass()
>>> t.get()
0