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 :

Question de base sur un template


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut Question de base sur un template
    Bonjour

    J'essaye de comprendre le fonctionnement des spécialisations de classes template.
    Plus précisément, je ne comprends pas pourquoi le code suivant ne compile pas, et renvoie des erreurs. Par exemple, le compilateur renvoie l'erreur "Error; this declaration has no storage class or type specifier" pour le mot clé cout dans la boucle if.

    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
     
    template <class T> 
    class Bag<T*> {
    private:
       T* elem;
        int size;
       int max_size;
     
    public:
       Bag() : elem(0), size(0), max_size(1) {}
     
       void add(T* t) {
          T* tmp;
          if (t == NULL) {   // Check for NULL
            cout<<"Null pointer!"<<endl;
            // return;
           }
     
          if (size + 1 >= max_size) {
             max_size *= 2;
             tmp = new T [max_size];
             for (int i = 0; i < size; i++)
                tmp[i] = elem[i];
             tmp[size++] = *t;  // Dereference
             delete [] elem;
             elem = tmp;
          }
          else
             elem[size++] = *t; // Dereference
       }
     
       void Pprint() {
          for (int i = 0; i <size; i++)
             cout << elem[i] << " ";
          cout << endl;
       }
    };
    Alors que si je ne spécialise pas la classe, le code suivant fonctionne parfaitement:

    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
     
    template <class T> 
    class Bag{
    private:
       T* elem;
        int size;
       int max_size;
     
    public:
       Bag() : elem(0), size(0), max_size(1) {}
     
       void add(T* t) {
          T* tmp;
          if (t == NULL) {   // Check for NULL
            cout<<"Null pointer!"<<endl;
            // return;
           }
     
          if (size + 1 >= max_size) {
             max_size *= 2;
             tmp = new T [max_size];
             for (int i = 0; i < size; i++)
                tmp[i] = elem[i];
             tmp[size++] = *t;  // Dereference
             delete [] elem;
             elem = tmp;
          }
          else
             elem[size++] = *t; // Dereference
       }
     
       void Pprint() {
          for (int i = 0; i <size; i++)
             cout << elem[i] << " ";
          cout << endl;
       }
    };
    Pourtant, ce code ne vient pas de moi, mais de la MSDN:
    http://msdn.microsoft.com/en-us/library/3967w96f.aspx

    Que se passe-t-il avec la spécialisation?
    Je vous remercie

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Bonjour,

    le problème n'a rien à voir avec cout, par contre template <class T> class Bag<T*> {..} n'a pas de sens, quel est le but ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Que se passe-t-il avec la spécialisation?
    Je vous remercie
    Manquerait pas tout simplement #include<iostream> et std::cout ?
    Quant à dire qu'il fonctionne parfaitement, l'as-tu instancié puis compilé ou juste compilé sans instancié ? (ensuite, il y a d'autres surprises dans la gestion du tableau dynamique)
    Citation Envoyé par bruno_pages Voir le message
    Bonjour,

    le problème n'a rien à voir avec cout, par contre template <class T> class Bag<T*> {..} n'a pas de sens, quel est le but ?
    Sisi : Qu'est-ce que la spécialisation de template ?(en fait une spécialisation partielle)

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Sisi : Qu'est-ce que la spécialisation de template ?(en fait une spécialisation partielle)
    mais il y a écrit template <class T> class Bag<T*>
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Manquerait pas tout simplement #include<iostream> et std::cout ?
    Non, j'ai bien mis std et iostream.
    Le code compile dans le deuxième cas de toute facon.


    Quant à dire qu'il fonctionne parfaitement, l'as-tu instancié puis compilé ou juste compilé sans instancié ?
    Je ne l'ai ni instancié, ni compilé. J'ai juste vu qu'il n'y avait pas d'erreur renvoyé par Visual Studio.

    En fait, je ne comprends pas pourquoi cela n'a pas de sens. Mais ce n'est pas grave, je me suis débrouillé autement

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    mais il y a écrit template <class T> class Bag<T*>
    Exemple : class trait dans cet article. Je ne trouve pas de référence clair sur la spécialisation partielle (faudra maj la faq?).

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    En fait la référence de deublete vers le MSDN est une explication de la spécialisation partielle.

  8. #8
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Toujours sur les templates et la spécialisation:

    Il parait que l'on ne peut pas utiliser des string pour déclarer des string comme paramètres de spécialisation de template. Comme le montre le lien suivant:

    http://msdn.microsoft.com/en-us/libr...dd(VS.90).aspx
    string literals are not permitted as parameter to a template specialization

    J'essaye de provoquer une erreur de ce type.

    Pourriez vous me donner un exemple qui provoque une telle erreur?
    merci

  9. #9
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Je vois pas pourquoi ils parlent de spécialisation. Les chaine de caractères sont interdites en paramètres templates que ça soit une spécialisation ou pas.

    Ce que ça veut dire c'est que pour les paramètres templates qui ne sont pas des types, les chaines de caractères sont interdites. (comme les float).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  10. #10
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    string literals are not permitted as parameter to a template specialization
    Attention, ils parlent bien de "string litteral", pas de string.

    Ce qui veut dire qu'il est bien possible de passer une string en paramètre template (sous forme de char*) :
    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
     
    #include <iostream>
     
    template <char* s>
    struct String
    {
       void print()
       {
          std::cout << s << std::endl;
       }
    };
     
    char toto[] = "toto";
     
    int main()
    {
       String<toto> s;
       s.print();
    }
    Mais qu'on ne peut pas spécialiser ce template avec un string litteral
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template <>
    struct String<"toto"> // erreur
    {
       void print()
       {
          std::cout << "on t'a reconnu toto" << std::endl;
       }
    };

  11. #11
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Autant pour moi, j 'avais souvenir que les chaines de caractères étaient interdites comme paramètres template.
    J'ai du faire un amalgame avec la spécialisation.

    (et maintenant que je le dis, oui ça me revient en tête..)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

Discussions similaires

  1. Question de base sur un template
    Par deubelte dans le forum Langage
    Réponses: 9
    Dernier message: 01/05/2010, 11h20
  2. [Débutant] Questions de base sur java
    Par JajaY dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2006, 18h51
  3. Question de base sur l'utilisation de la fonction date()
    Par deaven dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/12/2005, 15h33
  4. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20
  5. [Débutant] Question de base sur le BDE et les SGBD
    Par Invité dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/03/2005, 08h45

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