From: patb <cr...@ol...> - 2007-06-04 19:07:10
|
Hello, I need help wrapping two classes. One of the classes (the problematic one) is a template, which is derived from a class, given by one of it's own template parameters. Please have a look: Class "World" (simplified), this class is not that problematic, but it uses the problematic class: ___________________ class World { private: typedef std::vector<Node*> NodeVector; public: typedef SkipNullIterator< const Node, NodeVector, NodeVector::const_iterator > const_node_iterator; typedef SkipNullIterator< Node, NodeVector, NodeVector::iterator> node_iterator; const_node_iterator begin_nodes( void ) const throw(); node_iterator begin_nodes_w( void ) throw(); // ...snip... // }; ___________________ Second class "SkipNullIterator" (simplified, the problematic one!): ___________________ template< typename VAL, typename C, typename IT > class SkipNullIterator : public IT { public: typedef VAL value_type; typedef C container_type; typedef IT base_type; typedef SkipNullIterator<VAL, C, IT> self_type; // ...snip... // }; ___________________ As you can see, the second class, "SkipNullIterator", is beeing derived from IT, which is the template parameter IT. Basically, I just want to wrap the class "World". But in turn I also have to wrap "SkipNullIterator" and because it is a template class, I have to instantiate it the way the World class is using it. My attempt to wrap "SkipNullIterator" looks like this (skipnull_iterator.i): ___________________ %{ #include "skipnull_iterator.h" %} %include "skipnull_iterator.h"; %include "std_vector.i"; %template( vector_node ) std::vector< Node* >; %template( skipnull_iterator_world_const ) shawn::SkipNullIterator< const Node, vector_node, vector_node::const_iterator >; ___________________ Swig prints out the following warning: ___________________ skipnull_iterator.i:13: Warning(401): Nothing known about base class 'vector_node::const_iterator'. Ignored. ___________________ I understand that Swig does not know the base class vector_node::const_iterator (it is the base class, because it is the third template parameter for SkipNullIterator, from which SkipNullIterator derives), so I tried the following: ___________________ %{ #include "../src/sys/misc/skipnull_iterator.h" %} %include "../src/sys/misc/skipnull_iterator.h"; %include "std_vector.i"; %template( vector_node ) std::vector< shawn::Node* >; %template( vector_node_constit ) std::vector< shawn::Node* >::const_iterator; %template( skipnull_iterator_world_const ) shawn::SkipNullIterator< const shawn::Node, vector_node, vector_node_constit >; ___________________ I don't know if that makes sense at all, but I do not know how to tell Swig about the ::const_iterator. The interface code above produces a syntax error "skipnull_iterator.i:9: Error: Syntax error in input(1).". Note: In the code snippets above I always use "std::vector< Node* >", but the class world.h useses a typedef "typedef std::vector<Node*> NodeVector;" If there is a possibility to use the "NodeVector" typedef in the interface file, that would be great, but it is not a must. Please, it would be great if anyone can tell me how to correctly wrap the class "SkipNullIterator" and instantiate the needed template. Thanks a lot for your help! -- View this message in context: http://www.nabble.com/Problematic-template-class-to-wrap-tf3867207.html#a10956114 Sent from the swig-user mailing list archive at Nabble.com. |