Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Nouveau Membre du Club
    Homme Profil pro sylvain
    Technicien maintenance
    Inscrit en
    juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Nom : Homme sylvain
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : juillet 2009
    Messages : 112
    Points : 37
    Points
    37

    Par défaut Specialisation templace XE2

    bonjour ,

    J'ai un soucis sur les déclarations de template et spécialisation :

    Dans ma class
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    class com {
    public:
     
    template <class T>
    bool com::WriteCom(T str, int nBytesToWrite, int  &pBytesWritten) ;
    template <> :cry::cry:
    bool com::WriteCom<char>(char str, int nBytesToWrite, int  &pBytesWritten);
     
    };
     
    template <class T>
     bool com::WriteCom(T str, int nBytesToWrite, int  &pBytesWritten) {
     }
     
     template <>
     bool com::WriteCom<char>(char str, int nBytesToWrite, int  &pBytesWritten) {
     }
     
    #endif
    G une erreur de compilation
    E2099 Spécialisation explicite autorisée seulement dans portée du fichier ou espace de nommage
    Contexte d'analyseur complet
    com.cpp(23): #include com.h
    com.h(83): class com

    Merci beaucoup pour vôtre aide !

  2. #2
    Nouveau Membre du Club
    Homme Profil pro sylvain
    Technicien maintenance
    Inscrit en
    juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Nom : Homme sylvain
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : juillet 2009
    Messages : 112
    Points : 37
    Points
    37

    Par défaut

    hi !

    G trouvé une partie du problème :

    En validant l'option : compabilité : spécialisation de template de fonction membre

    Plus d'erreurs de compil .

    Pour l'appel de fonction pour arguments char , je suis obligé d'être explicite !!

    Code :
    1
    2
    3
    4
    5
    6
    7
     
     
    char g = 40 ;
    PortCom.WriteCo<char>(g,nBytesToWrite,nBytesToRead) ;   :cry::cry::(
     
    wstring M = L"test" ;  :ccool::ccool:
    PortCom.WriteCo(M,nBytesToWrite,nBytesToRead) ;
    Auriez vous une idée ??

    merci beaucoup !

  3. #3
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 045
    Points : 14 247
    Points
    14 247

    Par défaut

    Tu spécialise la méthode WriteCom dans la même classe que la template ??
    Cela dépasse mes pauvres connaissance de template !
    Changer ce genre d'option, ce n'est pas mon truc, je fais tout pour éviter de tel extrémité !

    Au final, si tu dois spécialiser explicitement, autant faire des méthode WriteChar, WriteInteger ... comme dans le TBinaryWriter
    En plus c'est plus lisible, on voit tout de suite ce que fait WriteXXX, alors qu'avec un template, il faudra lire le type de la variable, pour la maintenance, je ne suis pas convaincu !

    Tu fais ton propre composant pour le port COM ? tu sais qu'il en existe déjà et comme utilisé par bcp sont reconnus comme fiable !

    wstring ?
    Ne serait-il pas plus approprié en C++Builder d'utiliser String\UnicodeString ?
    Tu pourrais même d'ailleurs créer une classe hérité de TStream pour gérer le Port COM, tu n'aurais à coder QUE la variante buffer *void
    Ensuite, tu utilises un TBinaryWriter et TBinaryReader qui eux contient les variantes WriteChar, WriteString ...

    Perso, je n'ai jamais fait de template avec juste une méthode template mais plutôt une classe entièrement template puis des classes de spécialisation

    pour me simplifier la syntaxe, je fais un type intermédiaire indiquant le type templaté puis j'hérite de ce type pour y ajouter d'autres méthodes
    (je t'ai simplifié les noms, voir le sujet Template et Héritage)

    Code :
    1
    2
    3
    4
    template<class T, typename A> // T doit hérité d'un TObject, A n'a pas de restriction particulière
    class TTemplate : public TObjectList
    {
       ...
    Code :
    1
    2
    3
    4
    typedef TTemplate<TMachin, TBidule>TSpecializationBaseTemplate;
    class TSpecialization : public TSpecializationBaseTemplate
    {
      ...
    Code :
    1
    2
    3
    4
    template<> // spécialisation
    int TSpecializationBaseTemplate::Methode(TBidule* Variable)
    {
      ...
    Code :
    1
    2
    3
    4
    typedef TTemplate<TTruc, TChose> TAutreSpecializationBaseTemplate;
    class TAutreSpecialization : public TAutreSpecializationBaseTemplate
    {
      ...
    Code :
    1
    2
    3
    4
    template<> // spécialisation
    int TAutreSpecializationBaseTemplate::Methode(TChose* Variable)
    {
      ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Nouveau Membre du Club
    Homme Profil pro sylvain
    Technicien maintenance
    Inscrit en
    juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Nom : Homme sylvain
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : juillet 2009
    Messages : 112
    Points : 37
    Points
    37

    Par défaut

    merci beaucoup pour tout ces conseils .

    Ce n'est uniquement à titre pédagogique
    pour comprendre et assimiler le c++ et ces grands principes ......

    Si je fais la spécialisation dans la class c'est le même code erreur .
    E2099 Spécialisation explicite autorisée seulement dans portée du fichier ou espace de nommage

    merci !

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •