<div dir="ltr"><br><div>Hi Phil,</div><div><br></div><div>Thanks a lot for your reply.</div><div>I was hoping not to go that way to avoid any redundancy and some weakness in the code (any change to the template class methods would need to be propagated to all implementations).</div><div><br></div><div>There is no other way?</div><div>Cheers,</div><div>Denis</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">Le mer. 17 mai 2017 à 09:44, Phil Thompson <<a href="mailto:phil@riverbankcomputing.com">phil@riverbankcomputing.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 17 May 2017, at 5:56 am, Denis Rouzaud <<a href="mailto:denis.rouzaud@gmail.com" target="_blank">denis.rouzaud@gmail.com</a>> wrote:<br>
><br>
> Hi Davod,<br>
><br>
> Thanks a lot for you reply.<br>
><br>
> Le mar. 16 mai 2017 à 23:38, David Boddie <<a href="mailto:david@boddie.org.uk" target="_blank">david@boddie.org.uk</a>> a écrit :<br>
> On Tue May 16 20:49:57 BST 2017, Denis Rouzaud wrote:<br>
><br>
> > I am facing an issue with correcty implementing a template (container)) in<br>
> > SIP.<br>
> ><br>
> > Let’s say I have<br>
> ><br>
> > qgsoptional:<br>
> > template<class T><br>
> > class QgsOptional<br>
> > {<br>
> >   public:<br>
> >     QgsOptional( const T &data, bool enabled )<br>
> >       : mEnabled( enabled )<br>
> >       , mData( data )<br>
> >     {}<br>
> >   private:<br>
> >     bool mEnabled;<br>
> >     T mData;<br>
> > };<br>
> ><br>
> > qgsoptionalexpression.h:<br>
> ><br>
> > class QgsOptionalExpression : public QgsOptional<QgsExpression><br>
> > {<br>
> >   public:<br>
> >     QgsOptionalExpression();<br>
> > }<br>
><br>
> OK, so you are defining a class called QgsOptionalExpression here. As far as<br>
> I can see, this will conflict with what you are doing next:<br>
><br>
> > Now, I’d like to create the SIP file for QgsOptioalExpression. I tried with<br>
> > what I found in another topic [0]:<br>
> ><br>
> > class QgsOptionalExpression<br>
> > {<br>
> > %TypeHeaderCode<br>
> > #include "qgsoptional.h"<br>
> > typedef QgsOptional<QgsExpression> QgsOptionalExpression;<br>
> > %End<br>
> >   public:<br>
> >     QgsOptionalExpression();<br>
> > }<br>
><br>
> Here, you define QgsOptionalExpression again using a typedef, resulting in<br>
> the following error:<br>
><br>
> > But this gives me this error:<br>
> > python/core/qgsoptionalexpression.sip:29:36: error: typedef redefinition<br>
> > with different types ('QgsOptional' vs 'QgsOptionalExpression')<br>
> > typedef QgsOptional QgsOptionalExpression;<br>
> > The error points that the definition is already included in the header<br>
> > qgsoptionalepxression.h while I am actually not including it here (also gave<br>
> > it a try with including it).<br>
> ><br>
> > I understand the point, but how shall I tackle this?<br>
><br>
> Good. :-) Just for others reading this, the reason for the conflict is that<br>
> the typedef is included in the generated C++ code, so the compiler will<br>
> encounter both the class definition and the typedef.<br>
><br>
> If you don't need the class definition then remove it.<br>
><br>
> If you do need it then I think you should be able to leave out the typedef<br>
> and include the custom qgsoptionalexpression.h header instead:<br>
><br>
> class QgsOptionalExpression<br>
> {<br>
> %TypeHeaderCode<br>
> #include "qgsoptionalexpression.h"<br>
> %End<br>
>   public:<br>
>     QgsOptionalExpression();<br>
> }<br>
><br>
> Does that help?<br>
><br>
><br>
> This compiles but I don't have access to enabled() and data() methods in the template class (QgsOptional), which is a major issue.<br>
><br>
> With the inheritance written:<br>
> class QgsOptionalExpression : public QgOptional<QgsExpression><br>
> I get a "syntax error".<br>
><br>
> Any idea?<br>
<br>
Just lie to SIP and add them to the definition of QgsOptionalExpression.<br>
<br>
See QItemSelection in qitemselectionmodel.sip in PyQt5.<br>
<br>
Phil</blockquote></div>