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

它实现了公共(public)方法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) {}
};

}

写入接口(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++-命名空间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()。
如何从类myintclass更改接口(interface)文件的get()方法?

最佳答案

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

%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

09-30 20:22