Ошибка SWIG при наследовании от частично указанного класса шаблона со значениями по умолчанию, с предварительным объявлением без значений по умолчанию - PullRequest
0 голосов
/ 26 октября 2018

Я получил ошибку при попытке создать интерфейс SWIG для библиотеки, которую я хотел использовать. Код содержит класс, который наследуется от шаблонного класса, который включает значения по умолчанию. Тем не менее, шаблонный класс также имеет предварительное объявление, которое не включает значения по умолчанию. Я считаю, что это сбивает с толку глоток.

Вот простой пример:

frac.h (родительский класс):

#pragma once

// forward declaration
template <typename A, typename B>
class Frac;

// ... code using the forward declaraton

// definition
template <typename A=int, typename B=int>
class Frac
{
public:
    A a;
    B b;

    double divide()
    {
        return a / b;
    };
};

timestwo.h (детский класс):

#pragma once

#include "frac.h"

class TimesTwo : public Frac<double>
{
public:
    double getValue()
    {
        a = 10.5;
        b = 4;

        return divide() * 2;
    }
};

mylib.i файл:

%module mylib
 %{
 #include "timestwo.h"
 %}

%include "frac.h"

/*
If no %template is used:

mylib.h:15: Warning 401: Nothing known about base class 'Frac< double >'. Ignored.
mylib.h:15: Warning 401: Maybe you forgot to instantiate 'Frac< double >' using %template.
*/

/*
If put here: %template(frac_d) Frac <double>;

mylib.i:15: Error: Not enough template parameters specified. 2 required.
*/

/*
If put here: %template(frac_d) Frac <double, int>;

timestwo.h:5: Warning 401: Nothing known about base class 'Frac< double >'. Ignored.
timestwo.h:5: Warning 401: Maybe you forgot to instantiate 'Frac< double >' using %template.
*/

%include "timestwo.h"

Как показано в комментариях к mylib.i, я не могу правильно создать экземпляр шаблона, так как мне нужно использовать один аргумент шаблона, но поскольку предварительное объявление не определяет значения по умолчанию, оно говорит, что ожидает два .

1 Ответ

0 голосов
/ 27 октября 2018

Это просто предупреждение.Вы хотите создать экземпляр Frac или позвонить divide?В противном случае это работает:

>>> import mylib
>>> t = mylib.TimesTwo()
>>> t.getValue()
5.25

Если вы хотите иметь возможность звонить divide(), SWIG, похоже, не понимает значения по умолчанию для шаблона.Он работает путем обновления timestwo.h с Frac<double,int>, но если вы не хотите изменять заголовок, вы можете вручную скопировать определение в файле .i с исправлением:

%module mylib
%{
#include "timestwo.h"
%}

%include "frac.h"
%template(frac_d) Frac<double,int>; // Frac<double> doesn't work as of SWIG 3.0.12.

// Declare the interface the way SWIG likes it.
class TimesTwo : public Frac<double,int>
{
public:
    double getValue();
};

Демо:

>>> import mylib
>>> t = mylib.TimesTwo()
>>> t.getValue()
5.25
>>> t.divide()
2.625
...