IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Specialisation templace XE2 [Débutant]


Sujet :

C++Builder

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Points : 73
    Points
    73
    Par défaut Specialisation templace XE2
    bonjour ,

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

    Dans ma class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Points : 73
    Points
    73
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef TTemplate<TMachin, TBidule>TSpecializationBaseTemplate;
    class TSpecialization : public TSpecializationBaseTemplate
    {
      ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<> // spécialisation
    int TSpecializationBaseTemplate::Methode(TBidule* Variable)
    {
      ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef TTemplate<TTruc, TChose> TAutreSpecializationBaseTemplate;
    class TAutreSpecialization : public TAutreSpecializationBaseTemplate
    {
      ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Points : 73
    Points
    73
    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.

Discussions similaires

  1. [Etudes] spécialisation Lotus ou Exchange ?
    Par samarchpa dans le forum Stages
    Réponses: 15
    Dernier message: 17/02/2009, 17h04
  2. Reorientation ou specialisation
    Par black.out dans le forum Etudes
    Réponses: 6
    Dernier message: 19/06/2006, 14h56
  3. Réponses: 5
    Dernier message: 29/12/2005, 21h27
  4. Faut t'il se specialiser ?
    Par vedder dans le forum Emploi
    Réponses: 14
    Dernier message: 17/07/2005, 12h54
  5. [VB6]Déclaration d'un Constructeur Spécialisé
    Par TagadaTsoin dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 26/05/2004, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo