From: William S F. <ws...@fu...> - 2009-06-20 01:03:30
|
Adam A Smith wrote: > I have an error message that's mystifying me: > > $ swig -python -c++ BppString.i > /usr/share/swig1.3/typemaps/std_string.swg:17: Warning(402): Only forward > declaration 'string' was found. > > My interface file follows at the end of this message. Does anybody have > any idea what's going on? Also, is this a reasonably written interface > file? I've had a hard time following the documentation, to know exactly > *what* an interface file should contain. > > Thanks, > Adam > > %module bpp_string > %{ > #include "Clonable.h" > #include <string> > %} > > %include "Clonable.i" > %include "std_string.i" > > using std::string; > namespace bpp > { > > class String: public string, public Clonable > { > public: > String(const char * value): string(value); > String(const string & value): string(value); > virtual ~String(); > > public: > String * clone() const; > }; > > } //end of namespace bpp. > The std_string.i file only declares std::string as follows (best is to look at the preprocessed output using swig -E to see this): namespace std { %naturalvar string; class string; } so that should explain the warning. Wrapping strings is a little quirky. As you should have worked out by now SWIG deals with types and strings are an unusual type as they are not simple primitive types, like int, double and they are not classes/structs which are wrapped with proxy classes in the target language. They are something in between the C/C++ string is mapped to an immutable target language string. The wrappers for strings are therefore a bit unusual and simply having your own String type that derives from std::string does not make it easy to re-use the library code that SWIG ships for std::string. The quickest and easiest way is to run swig -E on std_string.i, take the preprocessed output, tidy it up and change std::string to String, and pop that in your own interface file. William |