Я получил ошибку при попытке создать интерфейс 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
, я не могу правильно создать экземпляр шаблона, так как мне нужно использовать один аргумент шаблона, но поскольку предварительное объявление не определяет значения по умолчанию, оно говорит, что ожидает два .