objective c, c++ et templates...

APAP Membre
Bonjour,

Je suis en train de porter un logiciel en c++ sur iPhone.
Le code contient de nombreux templates c++ contenus dans des .h

J'ai renommé les .cpp en .mm mais comment faire pour les .h contenant des templates? sachant que ces templates doivent être utilisés par un fichier objective c....

Réponses

  • AliGatorAliGator Membre, Modérateur
    20:17 modifié #2
    La notion de template n'existe pas en Objective-C... En Objective-C++ je sais pas... Dans l'absolu y'a pas de raison... mais si c'est pour utiliser tes templates en Objective-C, ça ne sera donc évidemment pas possible directement, cette notion n'existant pas.
    Donc pour ton problème, il te faudra faire des "wrappers", des classes en Objective-C qui vont utiliser tes templates C++, et n'exposer que des API compatibles Objective-C pour les utiliser avec ce langage.

    Le plus simple est même de faire un wrapper en C++ qui utilise ton template directement, de sorte de faire abstraction de ce template. Et utiliser ce wrapper C++ (qui du coup ne fait plus mention de ces notions de templates) dans des ficheirs Objective-C++ donc .mm (et il n'y aura donc plus de templates dans tes .h)

    Forcer à  utiliser le compilateur g++ et non gcc est aussi une solution, mais je doute que ce soit suffisant, la syntaxe de templates propres à  C++ (avec les "classe<Template>") étant en compétition avec la syntaxe des protocoles Objective-C.
  • APAP Membre
    20:17 modifié #3
    C'est à  peu près là  où j'en suis arrivé en tatonnant.
    Merci de ta réponse détaillée. Il me reste un autre problème les pthreads... mais c'est une autre histoire...
  • mpergandmpergand Membre
    20:17 modifié #4
    la syntaxe de templates propres à  C++ (avec les "classe<Template>") étant en compétition avec la syntaxe des protocoles Objective-C.

    ???
    #import &lt;Cocoa/Cocoa.h&gt;<br />#import &quot;CallbackObject.h&quot;<br />#import &quot;CircularBuffer.hpp&quot;<br /><br />using namespace MP_ADT;<br /><br />@interface CPP : NSObject&lt;CallbackObjectProtocol&gt; {<br />	<br />	CircularBuffer&lt;int&gt;*	buffer;<br /><br />}<br /><br />@end
    

    <br />#import &quot;CPP.h&quot;<br /><br /><br />@implementation CPP<br />-(id) init<br />{<br />	self=[super init];<br />	<br />	buffer=new CircularBuffer&lt;int&gt;(100);<br />	<br />	buffer-&gt;write(1000);<br />	printf(&quot;buffer %d&#092;n&quot;,buffer-&gt;read());<br />	<br />	return self;<br />}
    


    Si je fais:
    CPP* cpp=[[CPP alloc] init];

    aucun message d'erreur et ça m'affiche "buffer = 1000" dans la console, donc pour moi, il n'y a pas de problème  :)


  • AliGatorAliGator Membre, Modérateur
    20:17 modifié #5
    Etonnant, je n'avais jamais testé j'avoue...
    Mais comment fais-tu (et fait-il, le compilo) pour distinguer :
    - une variable d'instance déclarée comme type MaClasseObJC et devant implémenter le protocole MonProto (comme on déclare par exemple un delegate avec [tt]id<MachinDelegate>[/tt] quoi)
    - et une variable d'instance déclarée comme type MaClasseCpp template, générée avec comme template MonType ?

    MaClasseObjC&lt;MonProto&gt; toto;<br />MaClasseCpp&lt;MonType&gt; tata;
    
    C'est selon le contexte du nom (il sait que MaClasseObjC est une classe Objective-C et que MaClasseCpp est un class-template C++) ?
    Même si le compilo arrive à  s'y retrouver, du côté du code, c'est pas clair de toute façon ^^
  • mpergandmpergand Membre
    20:17 modifié #6
    Effectivement, il peut y avoir une ambiguà¯té:
    Protocol and template specifiers use the same syntax for different purposes:

    id<someProtocolName> foo;
    TemplateType<SomeTypeName> bar;
    To avoid this ambiguity, the compiler doesn't permit id to be used as a template name.
  • AliGatorAliGator Membre, Modérateur
    20:17 modifié #7
    En voilà  une citation intéressante :) Tu peux citer la source ? Tu l'as trouvée dans la doc ?
    Thx
  • AliGatorAliGator Membre, Modérateur
    20:17 modifié #9
    Super merci :)
Connectez-vous ou Inscrivez-vous pour répondre.