<div dir="ltr">Hi Davod,<div><br></div><div>Thanks a lot for you reply.<br><br><div class="gmail_quote"><div dir="ltr">Le mar. 16 mai 2017 à 23:38, David Boddie <<a href="mailto:david@boddie.org.uk">david@boddie.org.uk</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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></blockquote><div><br></div><div>This compiles but I don't have access to enabled() and data() methods in the template class (QgsOptional), which is a major issue.</div><div><br></div><div>With the inheritance written: </div><div>class QgsOptionalExpression : public QgOptional<QgsExpression> </div><div>I get a "syntax error".</div><div><br></div><div>Any idea?</div><div><br></div><div>Cheers,</div><div>Denis</div><div><br></div><div> </div></div></div></div>