problems using templates in test code?

"Meehan, Tim" <[email protected]> Mon, 30 Oct 2023 15:31:23 +0000
Newsgroups gmane.comp.programming.swig
Message-ID <PH7PR20MB4616FE1D0227B1A3417107559AA1A@PH7PR20MB4616.namprd20.prod.outlook.com>
I was trying to use a std::vector<std::string> with a template instantiation and got a lot of compilation errors.
The header file for the test code is:

#include <string>
#include <vector>
std::vector<std::string> get_list();
void set_list(std::vector<std::string> s);

The swig file is:

%module test
%{
#include "test.h"
%}

%include "std_string.i"
%include "std_vector.i"
vector_string get_list();
void set_list(vector_string s);
%template(vector_string) std::vector<std::string>;

I tried to generate code with:
#!/usr/bin/sh
swig -Wall -c++ -python test.i
ALLFILES=$(ls *cpp *cxx)
g++ -Wall -fPIC -shared $ALLFILES -o _test.so -I/usr/include/python3.10/

However, this generates the usual voluminous C++ error dump that I can't figure out. It seems to me I have instantiated the template already and it should be in the wrapper file already?

test_wrap.cxx: In function ‘PyObject* _wrap_get_list(PyObject*, PyObject*)’:
test_wrap.cxx:5714:3: error: ‘vector_string’ was not declared in this scope
 5714 |   vector_string result;
      |   ^~~~~~~~~~~~~
test_wrap.cxx:5717:3: error: ‘result’ was not declared in this scope; did you mean ‘resultobj’?
 5717 |   result = get_list();
      |   ^~~~~~
      |   resultobj
test_wrap.cxx:5718:39: error: expected type-specifier before ‘vector_string’
 5718 |   resultobj = SWIG_NewPointerObj((new vector_string(static_cast< const vector_string& >(result))), SWIGTYPE_p_vector_string, SWIG_POINTER_OWN |  0 );
      |                                       ^~~~~~~~~~~~~
test_wrap.cxx:1092:89: note: in definition of macro ‘SWIG_NewPointerObj’
 1092 | #define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
      |                                                                                         ^~~
test_wrap.cxx:5718:39: error: expected ‘)’ before ‘vector_string’
 5718 |   resultobj = SWIG_NewPointerObj((new vector_string(static_cast< const vector_string& >(result))), SWIGTYPE_p_vector_string, SWIG_POINTER_OWN |  0 );
      |                                  ~    ^~~~~~~~~~~~~
test_wrap.cxx:1092:89: note: in definition of macro ‘SWIG_NewPointerObj’
 1092 | #define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
      |                                                                                         ^~~
test_wrap.cxx: In function ‘PyObject* _wrap_set_list(PyObject*, PyObject*)’:
test_wrap.cxx:5727:3: error: ‘vector_string’ was not declared in this scope
 5727 |   vector_string arg1 ;
      |   ^~~~~~~~~~~~~
test_wrap.cxx:5742:23: error: ‘temp’ was not declared in this scope; did you mean ‘tm’?
 5742 |       vector_string * temp = reinterpret_cast< vector_string * >(argp1);
      |                       ^~~~
      |                       tm
test_wrap.cxx:5742:48: error: ‘vector_string’ does not name a type
 5742 |       vector_string * temp = reinterpret_cast< vector_string * >(argp1);
      |                                                ^~~~~~~~~~~~~
test_wrap.cxx:5742:62: error: expected ‘>’ before ‘*’ token
 5742 |       vector_string * temp = reinterpret_cast< vector_string * >(argp1);
      |                                                              ^
test_wrap.cxx:5742:62: error: expected ‘(’ before ‘*’ token
 5742 |       vector_string * temp = reinterpret_cast< vector_string * >(argp1);
      |                                                              ^
      |                                                              (
test_wrap.cxx:5742:64: error: expected primary-expression before ‘>’ token
 5742 |       vector_string * temp = reinterpret_cast< vector_string * >(argp1);
      |                                                                ^
test_wrap.cxx:5742:72: error: expected ‘)’ before ‘;’ token
 5742 |       vector_string * temp = reinterpret_cast< vector_string * >(argp1);
      |                                                                        ^
      |                                                                        )
test_wrap.cxx:5743:7: error: ‘arg1’ was not declared in this scope; did you mean ‘argp1’?
 5743 |       arg1 = *temp;
      |       ^~~~
      |       argp1
test_wrap.cxx:5744:39: error: type ‘<type error>’ argument given to ‘delete’, expected pointer
 5744 |       if (SWIG_IsNewObj(res1)) delete temp;
      |                                       ^~~~
test_wrap.cxx:5747:12: error: ‘arg1’ was not declared in this scope; did you mean ‘argp1’?
 5747 |   set_list(arg1);
      |            ^~~~
      |            argp1

_______________________________________________
Swig-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/swig-user