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

Langage C++ Discussion :

template "non-class type"


Sujet :

Langage C++

  1. #1
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 35
    Par défaut template "non-class type"
    Bonjour,

    Voila, je doit faire un programme qui dont le but est de créer une classe avec des Template qui permettront des faire un tableau d'élément avec des methode comme insert, delete, isEmpty ou autre. J'ai tester pour commencer avec des int, mais j'ai un problème des le insert:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Users\varfendell\Desktop\Darmstadt\Pogramming\conteneur\main.cpp|10|error: request for member `insert' in `test', which is of non-class type `Container<int> ()()'|
    Voici le code de ma classe main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include "Container.cpp"
     
    using namespace std;
     
    int main()
    {
        Container<int> test();
        int premier = 5;
        test.insert(premier);
        return 0;
    }
    le code de contenair.h:

    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
    /***********************************************************************
     * Module:  Container.h
     * Author:  varfendell
     * Modified: mardi 1 juin 2010 19:39:53
     * Purpose: Declaration of the class Container
     ***********************************************************************/
     
    #ifndef DEF_Container
    #define DEF_Container
     
    using namespace std;
     
    template<class Element>
    class Container
    {
        public:
            Container();
            void insert(Element x);
            void delet(Element x);
            int size();
            Element begin();
            Element end();
            bool isEmpty();
            void for_each(void(*f)(Element&));
     
        private:
            Element tableauElement[];
            int taille;
     
    };
     
    #endif
    et de container.cpp:

    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
    #include "Container.h"
     
    template<class Element>
        Container<Element>::Container()
        {
            taille = 0;
            this.tableauElement = new Element[taille];
        }
     
    template<class Element>
        void Container<Element>::insert(Element x)
        {
            taille++;
            Element temp = this.tableauElement;
            this.tableauElement = new Element[taille];
            this.tableauElement = temp;
            this.tableauElement[taille-1] = x;
        }
     
    template<class Element>
        void Container<Element>::delet(Element x)
        {
     
        }
     
    template<class Element>
        int Container<Element>::size()
        {
            return 0;
        }
     
    template<class Element>
        Element Container<Element>::begin()
        {
     
        }
     
    template<class Element>
        Element Container<Element>::end()
        {
     
        }
     
    template<class Element>
    bool Container<Element>::isEmpty()
        {
            if (taille == 0)
                return true;
            else
                return false;
        }
     
    template<class Element>
        void Container<Element>::for_each(void(*f)(Element&))
        {
     
        }

  2. #2
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par varfendell Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
    #include "Container.cpp"
     
    using namespace std;
     
    int main()
    {
        Container<int> test();
        //
    }
    Tu ne déclares pas une variable de type Container<int> mais une fonction qui renvoi un Container<int> et qui ne prend aucun paramètres.

    Enlèves les () juste après le nom de ta variable (test dans ce cas-ci).

    Ce problème mis à part (qui est la source de ton erreur), tu as beaucoup de problèmes de syntaxe dans ton code:

    this est un pointeur, et non une référence. Tu dois donc le déréférencer pour avoir accès au contenu. Tu peux le faire soit avec l'opérateur * soit avec l'opérateur ->.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this->tableau = //...
    (*this).tableau = //...
    De plus, ton utilisation des tableaux est erronée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T tab[] = new T[ 10 ]; // faux!
    Pour avoir un tableau dont la taille est allouée dynamiquement, tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T *tab = new T[ 10 ]; // ok

  3. #3
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 35
    Par défaut
    Merci beaucoup,

    En faite je vais plutôt utiliser un vector, ça sera plus simple avec push_back et pop_back.

    edit:

    j'ai remplacer tout les this. par des this-> , c'est un oublie que je fait fréquemment, mea culpa

  4. #4
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Euh... oO !

    Non pas que je veuille discuté sur l'intérêt pédagogique de recoder un vector, mais là quand même... Je vois vraiment, mais alors vraiment pas, l'intérêt qu'il pourrait y avoir à recoder un vector en utilisant le std::vector :S...

    Après c'est peut-être moi aussi....

  5. #5
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 35
    Par défaut
    ben disons que mon sujet est en allemand, et que je n'ai peut être pas tout compris, mais le but du TP est de créer un container avec template (afin qu'il puisse être créer par tout les types d'éléments). Les Élément sont donc stocker dans ce container, et je doit implémenter les méthodes suivantes:

    • s.insert(x) fügt x in die Menge s ein
    • s.delete(x) entfernt das Element x aus s
    • x=s.size() liefert die Anzahl der Elemente von s
    • it=s.begin() liefert Iterator it, der auf das erste Element der Menge s zeigt
    • it=s.end() it ist Iterator auf das Ende der Menge s
    • b=s.isEmpty() testet, ob s die leere Menge ist (bool b)
    • s.for_each(void (*f)(T&)) soll alle Elemente der Menge s durch die Funktion f
    bearbeiten

    Les commentaire sont en allemand, mais t'as pas besoin de les comprendre pour savoir ce que doit faire la fonction.

    Ensuite sa va être plus compliqué, parce que même en traduisant j'arrive pas a comprendre:
    • m=s.intersect(v) m ist die Durchschnittsmenge von s und v
    • m=s.union(v) m ist die Vereinigungsmenge von s und v

    Voila, une fois ceci fini, je vais devoir le mettre en relation avec un autre projet dans lequel on a créé des compte (bancaire) de différents type par polymorphie, et ainsi le tester

  6. #6
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Bien que je ne parle pas un mot d'allemand, j'ai très bien compris:

    • m=s.intersect(v) m contiendra l'intersection des éléments de s et v
    • m=s.union(v) m contiendra l'union des éléments de s et v

    C'est de la théorie des ensembles de base qu'on apprend au collège

    De plus, si on te demande de faire ça, c'est certainement pas pour que tu utilises vector derrière qui fait déjà tout à ta place

  7. #7
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 35
    Par défaut
    donc il fraudais mieux que je reste sur les tableau en effet, je veins de discuter du sujet avec un de mes camarade français, c'est en effet les tableaux qu'il faut utiliser.

    Je sais tres bien ce que sont les intersection et les unions, c'est juste que ici je ne vois aps ce que sa pourrait donner....

    m=s.intersect(v) si s contient 3 comptes et v 2 comptes, et que 1 compte est le meme dans les deux liste, sa donne quoi?

    m=s.union(v) si s contient 3 comptes et v 2 comptes, et que 1 compte est le meme dans les deux liste, sa donne ce meme compte

  8. #8
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par varfendell Voir le message
    donc il fraudais mieux que je reste sur les tableau en effet, je veins de discuter du sujet avec un de mes camarade français, c'est en effet les tableaux qu'il faut utiliser.

    Je sais tres bien ce que sont les intersection et les unions, c'est juste que ici je ne vois aps ce que sa pourrait donner....

    m=s.intersect(v) si s contient 3 comptes et v 2 comptes, et que 1 compte est le meme dans les deux liste, sa donne quoi?

    m=s.union(v) si s contient 3 comptes et v 2 comptes, et que 1 compte est le meme dans les deux liste, sa donne ce meme compte
    si S = { 1, 2, 3 } et que V = { 3, 4, 5 }

    Intersection
    M = { 3 }

    Union
    M = { 1, 2, 3, 4, 5 }

  9. #9
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 35
    Par défaut
    Je suppose que ça marche de la même façon quand on prend des compte bancaire.

  10. #10
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Non, la en fait, ça craint un peu...

    Problème de sémantique d'entité, car chaque compte et différent... l'opérateur == n'a pas vraiment de sens...

    Dans se cas, ton vecteur sera plus un vecteur de référence... Et tu compare les adresses (un peu comme le fait shared_ptr).

    Mais ça reste que ça craint... Car les vector, c'est juste des tableaux, pas des ensembles...

  11. #11
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 35
    Par défaut
    et si on considère que chaque compte a un identifiant, on peut le faire juste en comparant les identifiant de compte qui sont des entier, dan ce cas l'opérateur = sera d'actualité?

  12. #12
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par varfendell Voir le message
    et si on considère que chaque compte a un identifiant, on peut le faire juste en comparant les identifiant de compte qui sont des entier, dan ce cas l'opérateur = sera d'actualité?
    Dans ce cas il faut que tu ais un un conteneur qui contient la liste de tous tes comptes bancaires et que les autres ensembles n'aient que des pointeurs vers ces comptes.

  13. #13
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    A condition d'être sur de ne pas avoir de redondance, oui... Mais souvent le plus simple et alors de prendre l'adresse en tant qu'identifiant.

    Le principale problème, c'est que la copy va rarement de pair avec les entités... Qu'on passe alors par référence.

    Survient alors le problème de la durée de vie. D'ou, smart pointer. Après, tu peux très bien considérer pouvoir faire des copy / move / delete / etc... Mais si tu peux accéder à un compte a plusieurs endroit, tu peux potentiellement les modifier...
    Et si tu modifie une copie, tu ne modifies pas l'original... Donc patatra... Parce que même si tu arrive à faire un système de merge, aucune chance de bien propager les modifications facilement...

    Mais au passage, l'utilisation de ton vector ne te regarde pas...

    TON problème est que les éléments d'un ensemble ont généralement certaines contraintes ... [s = Vrai ou pas pas grave, pas le sujet surtout]Qui se marie mal à la programation générique[/s].

    Par exemple, pour union et intersection... Ca suppose quelque part que les objets qu'on peut stocké dans ton vecteur nécessite l'opérateur == !

    C'est ça qui est moche pour un vector en fait... C'est plus un vector à partir de ce moment, donc pourquoi pas utiliser std::vector, et ce focalisé sur l'ensemble.
    Après, je ne suis pas dans la tête de ton professeur... Demander à l'auteur ce qu'il attend serait mieux à mon avis...

    PS : Comme quoi, y a pas qu'en France que la formation est ....

  14. #14
    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
    Par défaut
    Un compte n'a pas une sémantique d'entité parce que c'est un compte. Mais parce que, en général, dans une application 'bancaire' la classe Compte a cette sémantique et sert de base pour l'héritage.
    Dans ton exercice, peut-être que compte a une sémantique de valeur portée par un identifiant et un montant ou je ne sais quoi d'autre. On ne peut répondre comme ça. Il faudrait connaître l'énoncé exacte de l'exercice et son objectif (apprendre à manipuler les pointeurs ? Apprendre l'algorithme des ensembles avec la STL ? Apprendre l'héritage ? Apprendre la programmation générique ? etc.).

  15. #15
    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
    Par défaut
    Citation Envoyé par Lavock Voir le message
    A condition d'être sur de ne pas avoir de redondance, oui... Mais souvent le plus simple et alors de prendre l'adresse en tant qu'identifiant.
    Prendre l'adresse comme identifiant. Bof. Ca n'a aucun sens et ça peut varier d'une exécution sur l'autre.

    Citation Envoyé par Lavock Voir le message
    Mais au passage, l'utilisation de ton vector ne te regarde pas...

    Citation Envoyé par Lavock Voir le message
    TON problème est que les élément d'un ensemble on certaine contraite généralement...
    J'ai rien compris. C'est une traduction automatique de google ?
    Citation Envoyé par Lavock Voir le message
    Qui se marie mal à la programation générique.
    Je ne comprend pas à quoi se rapporte cette assertion.

    Citation Envoyé par Lavock Voir le message
    Par exemple, pour union et intersection... Ca suppose quelque part que les objets qu'on peut stocké dans ton vecteur nécessite l'opérateur == !
    Pas besoin. Ca a plutôt besoin d'une relation d'appartenance entre un élément et un ensemble.
    Citation Envoyé par Lavock Voir le message
    C'est ça qui est moche pour un vector en fait...

    Citation Envoyé par Lavock Voir le message
    C'est plus un vector à partir de ce moment, donc pourquoi pas utiliser std::vector,
    peut être parce que c'est l'objectif de l'exercice ... ou pas.

  16. #16
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Prendre l'adresse comme identifiant. Bof. Ca n'a aucun sens et ça peut varier d'une exécution sur l'autre.
    Effectivement, si le programme est destiné à être lancé plusieurs fois, style serveur d'application, va falloir un truc beaucoup plus complexe... mais faut pas exagérer. Au sein d'une même exécution, rien de mieux que l'adresse.
    Citation Envoyé par 3DArchi Voir le message
    Il code un vector (ce qui en a l'air). Si ça s'arrête là, il n'a pas a prendre en compte ce qui peut y être mis...

    Citation Envoyé par 3DArchi Voir le message
    J'ai rien compris. C'est une traduction automatique de google ?
    Ensemble = ensemble au sens mathématique...

    Citation Envoyé par 3DArchi Voir le message
    Je ne comprend pas à quoi se rapporte cette assertion.
    Ben type contraint dans de la progr générique, c'est pas non plus évident à gérer proprement.

    Citation Envoyé par 3DArchi Voir le message
    Pas besoin. Ca a plutôt besoin d'une relation d'appartenance entre un élément et un ensemble.
    Oui sur, m'enfin la complexité algorithmique des axiomes sans trouves décuplé... (et encore, je suis pas sûr que tout puisse être exprimé ainsi).
    De plus, cela ne résout en rien le problème. Soit les élément sont identifiable/comparable (égalité), soit ils ont une fonction appartientA.

    Citation Envoyé par 3DArchi Voir le message
    C'est peut-être strictement personnel, mais chez moi, un vector n'a aucun prérequis sur ces contenants...

    Citation Envoyé par 3DArchi Voir le message
    peut être parce que c'est l'objectif de l'exercice ... ou pas.
    J'ai un doute, rien de plus... Il peut aussi avoir un professeur exigeant.


    Pour la sémantique, là, j'avoue, j'ai extrapolé. Mais je me demande quel interêt peut avoir un compte précisé bancaire dans une application qui ne l'ai pas...

    PS : Si tu arrives a me trouver une espèce de compte qui a besoin d'un identifiant, mais qui n'a pas de sémantique d'entité, MP moi.

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Ben type contraint dans de la progr générique, c'est pas non plus évident à gérer proprement.
    Mais non... Pis bon, laisse l'utilisateur passé ce qui veut, ça lui pétera à la tête .

  18. #18
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    ><!

    Je me vois bien dire ça à la rendu d'un de mes projets : bon ben je vous est mis aucune assertion, comme ça, si vous faite un truc qui faut pas, ben vous trouverez jamais l'erreur, et vous serez obligé de m'appeler !

    Mais classe en faite ! On pourrait monter une société basé sur ce principe et on ferait raquer les gens à chaque fois ! Comment ça c'est déjà fait ...

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Attends, ici on parle d'un vector, donc on est d'un point de vue de conception de bibliothèque, toi tu compares ça a du code client.
    Si le concept que tu introduits est bien documenté alors je répète, laisse l'utilisateur (de la bibliothèque!) ce cassé la gueule, c'est un peu l'esprit du C++ d'ailleurs.

    Mais sinon, SFINAE marche bien pour ce genre de chose (+ static_assert).

  20. #20
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Erf, cursus oblige, j'ai tendance à comparer tout exercice avec une consigne a du code client...

    Mais oui, le C++ offre la possibilité du "Lis La Doc B*****".

    A me relire, j'avoue que mon assertion ne servait a rien... Du coup, je l'ôte.

    (au passage : a quand la balise [strike] !)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/02/2013, 20h59
  2. Request member non-class type… C++
    Par sarahjayneburrell11 dans le forum Langage
    Réponses: 7
    Dernier message: 23/12/2011, 19h47
  3. Réponses: 29
    Dernier message: 23/08/2010, 09h24
  4. Problème:Erreur 'which is of non-class type
    Par abzal dans le forum Débuter
    Réponses: 9
    Dernier message: 28/11/2008, 15h54
  5. Erreur 'which is of non-class type' ?
    Par jahmanzaar dans le forum Débuter
    Réponses: 7
    Dernier message: 15/10/2008, 22h53

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