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++ Discussion :

Spécialisation totale d'une sous-classe template.


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut Spécialisation totale d'une sous-classe template.
    Bonjour.


    Je cherche actuellement à réussir la spécialisation d'une méthode membre d'une sous-classe template :
    la déclaration de la classe étant la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <int HiTime>
    class Cv_Acquisition : Base_Acquisition<CvCapture*>
    {
      [...]
      private :
      template <bool positive>
      class WaitOp
      {
        void operator()() const;//méthode à spécialiser
      };
      [...]
    };
    et l'implémentation de l'opérateur en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <int HiTime>
    template <bool positive>
    void Cv_Acquisition<HiTime>::WaitOp<positive>::operator()() const
    {
      [...]
    }
    Jusqu'ici, pas de problème. mais lorsque j'essaye d'écrire une spécialisation, tout dérape.

    En effet, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <int HiTime>
    template <>
    void Cv_Acquisition<HiTime>::WaitOp<false>::operator()()
    {
    }
    me renvoie les erreurs:
    Citation Envoyé par gcc 4.4.1
    [...]
    /.../Cv_Acquisition.hpp:47: error: invalid explicit specialization before ‘>’ token
    /.../Cv_Acquisition.hpp:47: error: enclosing class templates are not explicitly specialized
    /.../Cv_Acquisition.hpp:48: error: invalid use of incomplete type ‘class Cv_Acquisition<HiTime>::WaitOp<false>’
    /.../Acquisition.h:91: error: declaration of ‘class Cv_Acquisition<HiTime>::WaitOp<false>’
    Process terminated with status 1 (0 minutes, 2 seconds)
    4 errors, 0 warnings
    et si je tente de mettre la spécialisation directement apres la sous classe comme suit:
    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
    template <int HiTime>
    class Cv_Acquisition : Base_Acquisition<CvCapture*>
    {
      [...]
      private :
      template <bool positive>
      class WaitOp
      {
        void operator()() const;
      };
     
      //SPECIALISATION
      template <>
      void WaitOp<false>::operator()() const
      {
        [...]
      }
      [...]
    };
    j'ai alors droit à l'ereur:
    Citation Envoyé par gcc 4.4.1
    [...]
    /.../Acquisition.h:94: error: explicit specialization in non-namespace scope ‘class Cv_Acquisition<HiTime>’
    /.../Acquisition.h:95: error: invalid use of incomplete type ‘class Cv_Acquisition<HiTime>::WaitOp<false>’
    /.../Acquisition.h:91: error: declaration of ‘class Cv_Acquisition<HiTime>::WaitOp<false>’
    Process terminated with status 1 (0 minutes, 2 seconds)
    3 errors, 0 warnings
    J'avoue ne pas du tout comprendre la raison de ce refus du compilateur... si quelqu'un a une idee....

    merci

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Pour la première tentative, je suis presque sûr que pour spécialiser une nested template class, il faut que la classe englobante soit elle même spécialisée.

    Le code ci dessous compile comme un charme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //en dehors de la classe
    template <>
    template <> 
    void Cv_Acquisition<5>::WaitOp<false>::operator()() const
    {
    }
    Après, que ca ne colle pas à ce que tu souhaites, je concoit très bien, je suis tombé sur le même problème avec les fonctions membres template d'une classe template ^^. La seule solution que j'ai trouvée à été de rendre la fonction libre

    En ce qui concerne la 2eme tentative, il faut qu'une spécialisation partielle soit dans un namespace et non dans une classe, d'où l'erreur.

  3. #3
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Pour la première tentative, je suis presque sûr que pour spécialiser une nested template class, il faut que la classe englobante soit elle même spécialisée.
    -_-' je l'avais lu quelque part, mais la nouvelle norme n'avait-elle pas prévu d'anuller ce comportement (je ne sait même plus à quoi il est dû...) ?

    Citation Envoyé par Davidbrcz Voir le message
    La seule solution que j'ai trouvée à été de rendre la fonction libre
    j'ai essayé de mettre ma structure en dehors de ma classe, et effectivement, ça compile farpaitement dans ce cas, mais je ne souhaitais pas la rendre publique Enfin, à la limite, je peux mettre ça comme une extention de fonctional, du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     template <bool expression, typename TrueFunctor, FalseFunctor>
    class is_true;
    . Boost ne propose-t'il d'ailleurs pas une fonctionalité similaire ? (il me semble en avoir entendu parlé
    Citation Envoyé par Davidbrcz Voir le message
    En ce qui concerne la 2eme tentative, il faut qu'une spécialisation partielle soit dans un namespace et non dans une classe, d'où l'erreur.
    En même temps, les namespaces templates n'existent pas -_-' (ou alors, je suis pas au courant)...

    Bon, boost ou ma std::functional... a voir...

    Edit: pas trouvé dans boost... j'ai du rêver. Bon, ben go ma petite fonction alors.

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Bon, je m'en suis sorti avec la fonction is_true. pour ceux que ça intéresserait, je la met ici:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    //stdFunctionalExtention.h
    #ifndef STDFUNCTIONALEXTENTION_H_INCLUDED
    #define STDFUNCTIONALEXTENTION_H_INCLUDED
    #include <iostream>
    /**
    * A functor class who call a functor depending of it first template parameter
    * All is done at compile time
    */
    namespace std
    {
      template <bool expression,class RetType, class TrueFunctor,class FalseFunctor>
      struct is_true
      {
        inline RetType operator()() const;
      };
     
     
      ///True generic case
      template <class RetType,class TrueFunctor, class FalseFunctor>
      struct is_true<true,RetType,TrueFunctor,FalseFunctor>
      {
        TrueFunctor t;
        inline RetType operator()() const
        {
          t();
        }
      };
      ///False Generic case
      template <class RetType,class TrueFunctor, class FalseFunctor>
      struct is_true<false,RetType,TrueFunctor,FalseFunctor>
      {
        FalseFunctor f;
        inline RetType operator()() const
        {
          f();
        }
      };
     
      ///void RetType True case
      template <class TrueFunctor, class FalseFunctor>
      struct is_true<true,void,TrueFunctor,FalseFunctor>
      {
        TrueFunctor t;
        inline void operator()() const
        {
          t();
        }
      };
      ///void RetType False case
      template <class TrueFunctor, class FalseFunctor>
      struct is_true<false,void,TrueFunctor,FalseFunctor>
      {
        FalseFunctor f;
        inline void operator()() const
        {
          f();
        }
      };
    }
     
    #endif // STDFUNCTIONALEXTENTION_H_INCLUDED
     
     
    #endif // STDFUNCTIONALEXTENTION_H_INCLUDED
    Par contre, je me suis aperçu d'une chose bizarre avec la complétion automatique de codeblock, c'est qu'apparement, il y aurait déjà un is_true, et même des is_polymorphic, is_typename derriere le mot cle std... mais impossible de trouver la moinde doc là dessus... et pas de conflict non plus, mais je suppose que c'est dans des headers spécifiques... c'est peut-être une fonction de C++0x implémentée dans gcc...je vais poser une question là dessus.

    Merci

    edit: rectification. ils existent tous sauf is_true qui est de mon cru. je n'en avait jamais entendu parler c'est tout.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/04/2013, 12h07
  2. Problème avec une sous classe de Graphics2D
    Par Virgile le chat dans le forum 2D
    Réponses: 1
    Dernier message: 16/06/2007, 02h59
  3. Réponses: 1
    Dernier message: 17/11/2006, 16h57
  4. Instanciation d'une sous-classe
    Par iubito dans le forum Langage
    Réponses: 6
    Dernier message: 23/01/2006, 16h27

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