¿Cómo crear una instancia de un método de plantilla de una clase de plantilla con swig?

Tengo una clase en C ++ que es una clase de plantilla, y un método en esta clase tiene una plantilla en otro marcador de posición

template  class Whatever { public: template  void foo(std::vector values); } 

Cuando transporte esta clase al archivo swig, lo hice

 %template(Whatever_MyT) Whatever; 

Desafortunadamente, cuando trato de invocar foo en una instancia de Whatever_MyT de python, aparece un error de atributo. Pensé que tenía que instanciar la función miembro con

 %template(foo_double) Whatever::foo; 

que es lo que escribiría en C ++, pero no funciona (aparece un error de syntax)

¿Dónde está el problema?

Declare las instancias de las plantillas miembro primero, luego declare las instancias de las plantillas de clase.

Ejemplo

 %module x %inline %{ #include template class Whatever { T m; public: Whatever(T a) : m(a) {} template void foo(V a) { std::cout << m << " " << a << std::endl; } }; %} // member templates // NOTE: You *can* use the same name for member templates, // which is useful if you have a lot of types to support. %template(fooi) Whatever::foo; %template(food) Whatever::foo; // class templates. Each will contain fooi and food members. // NOTE: You *can't* use the same template name for the classes. %template(Whateveri) Whatever; %template(Whateverd) Whatever; 

Salida

 >>> import x >>> wi=x.Whateveri(5) >>> wd=x.Whateverd(2.5) >>> wi.fooi(7) 5 7 >>> wd.fooi(7) 2.5 7 >>> wi.food(2.5) 5 2.5 >>> wd.food(2.5) 2.5 2.5 

Referencia: 6.18 Plantillas (busque “plantilla de miembro”) en la documentación de SWIG 2.0 .