gpt4 book ai didi

c# - Swig C++ 到 C# : How to wrap classes from C++ to make methods from template class available in derived class in C#?

转载 作者:行者123 更新时间:2023-11-30 05:18:36 30 4
gpt4 key购买 nike

我在命名空间 external::internal 中有模板类 BaseMyPoint

它实现了公共(public)方法 X()、Y()、Z() 和 SetCoord()。

然后写

typedef internal::BaseMyPoint MyPointd;

创建派生类MyPoint,继承MyPointd public

两个类的描述都存储在文件“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) {}
};

}

在接口(interface)文件“myPoint.i”中写入:

%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“MyPoint”不包含“Z”的定义并且没有扩展方法“Z”接受第一个可以找到“MyPoint”类型的参数(您是否缺少 using 指令或程序集引用?)

错误 CS1061“MyPoint”不包含“Y”的定义并且没有扩展方法“Y”接受第一个可以找到“MyPoint”类型的参数(您是否缺少 using 指令或程序集引用?)

错误 CS1061“MyPoint”不包含“X”的定义并且没有扩展方法“X”接受第一个可以找到“MyPoint”类型的参数(您是否缺少 using 指令或程序集引用?)

错误 CS1061“MyPoint”不包含“SetCoord”的定义并且没有扩展方法“SetCoord”可以找到接受类型为“MyPoint”的第一个参数(您是否缺少 using 指令或程序集引用?)

如何使这些方法在 C# 类 MyPoint 中可用?

提前感谢您的关注,基里尔

编辑 1

这是清楚表达我的问题的简单示例。

在“file.h”中我写

template <typename T>
class myclass {
public:
T get() const { return 0; }
};

class myintclass : public myclass<int> {};

在“file.i”中我写

%template (myclassi) myclass<int>

当我编译接口(interface)文件时出现警告:

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()。如何更改接口(interface)文件以从类 myintclass 获取 get () 方法?

最佳答案

给定 file.h 在您的编辑中,正确声明所有内容有点棘手。理想情况下,模板应该位于与 myintclass 定义不同的单独 header 中,但这是一种经过测试的方法:

文件.i

%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

关于c# - Swig C++ 到 C# : How to wrap classes from C++ to make methods from template class available in derived class in C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41607471/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com