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] Attribut accessible à toute instance de la classe avec tout param template


Sujet :

Langage 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 : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut [template] Attribut accessible à toute instance de la classe avec tout param template
    Bonsoir.

    j'ai récemment créé une classe angle comme celle ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template<int cycle>class angle
    {
        protected:
        int agl;
     
        public:
        angle(int a=0);
     
        template<int acycle>
        angle(angle<acycle> a);
     
        ...
     }
    Vous remarquerez le constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<int acycle>
        angle(angle<acycle> a);
    Celui ci permet de recopier n'importe quel autre type d'angle.

    Le problème est que quand je veut définir ce constructeur, je me heurte à un mur: comment accéder à l'attribut a.agl puisque a est considéré comme une autre classe et que agl n'est du coup plus accessible... ?


    Merci pour votre aide.

    Cordialement
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  2. #2
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonsoir,
    Je vois 3 solutions:
    - Passer par un accesseur. Mais je suppose que c'est se que tu veux éviter.
    - Déclarer cette class friend avec toutes les valeurs de acycle possible. (si il y en as peu, pourquoi pas)
    - Hériter d'une class de base qui contient agl en protected.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Nogane Voir le message
    Bonsoir,
    Je vois 3 solutions:
    - Passer par un accesseur. Mais je suppose que c'est se que tu veux éviter.
    oui, je ne l'utiliserais qu'en dernier recours.

    Citation Envoyé par Nogane Voir le message
    - Déclarer cette class friend avec toutes les valeurs de acycle possible. (si il y en as peu, pourquoi pas)
    Ce n'est pas moi qui vais utiliser cette classe donc ça parais une mauvaise idée...


    Citation Envoyé par Nogane Voir le message
    - Hériter d'une class de base qui contient agl en protected.
    tu veut dire créer une nouvelle classe qui hérite d'angle<acycle> ?

    mais dans ce cas, cette classe doit elle même avoir un accesseur public, ce qui ne fait que reporter le premier problème... ou bien elle doit avoir déclarer la classe appelante en friend ce qui revient au second problème ...

    L'idéal serait d'avoir un équivalent du static au niveau template....


    merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    question subsidiaire:

    Dans le cas ou je devrais utiliser un accesseur, il serait de toutes façon inline, mais serait il plus performant comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline int accesseur()const
    {
        return agl;
    }
    ou comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline & int accesseur()const
    {
        return agl;
    }
    merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  5. #5
    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
    c'est un int, donc le passage par référence est plus lourd que celui par copie.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    eclesia m'a aidé (sur le chat) à trouver cette solution:
    On crée la méthode convert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<int acycle>
        inline angle<acycle> convert()const;
    que l'on appelle comme cec ipour avoir l'angle:Le défaut est que c'est un peu crade (ça crée une méthode public en plus pour ça) mais surtout que ça crée un angle transitoire (qui doit être équivalent à un int) donc ça fait perdre du temps...

    bref: j'espere toujours mon static template...

    merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Si agl est variable à l'exécution, tu seras obligé d'introduire un surcout.
    Sinon, tu peux utiliser une sorte de rebinding qui sera propagé à l'exécution.
    Mais dans tous les cas, tes classes seront différentes. Si tu veux limiter l'impact sur l'extérieur, tu peux définir une nested class template, qui contient l'angle, et jouer sur la conversion à l'exécution avec l'une des méthodes possibles présentées ci-dessus.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Alp Voir le message
    une sorte de rebinding
    heu....
    Citation Envoyé par Alp Voir le message
    une nested class template
    heu...

    Je suis désolé, mais je n'ai pas encore tout ce vocabulaire... Pourrais -tu préciser s'il te plait ?


    merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  9. #9
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Envoyé par Nogane Voir le message
    - Hériter d'une class de base qui contient agl en protected.
    tu veut dire créer une nouvelle classe qui hérite d'angle<acycle> ?
    Désolé je ne me suis pas très bien expliqué.
    L'idée n'est pas d'heriter d'angle<acycle>, mais au contraire de faire heriter toute les class angle<T> d'une class de base, qui contiendrai la variable agl.
    Comme ceci:

    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
    #include <iostream>
     
    using namespace std;
     
    class angleBase
    {
      protected:
      int agl;
     
      angleBase(int a):
        agl(a)
      {
      }
     
      angleBase(const angleBase &a):
        agl(a.agl)
      {
      }
    };
     
    template<int cycle>
    class angle : public angleBase
    {
        public:
        angle(int a = 0):
          angleBase(a)
        {
        }
     
        template<int acycle>
        angle(angle<acycle> a):
          angleBase(a)
        {
          cout << agl << endl;
        }
    };
     
    int main()
    {
      angle<3> angle1(12);
      angle<48> angle2(angle1);
      return 0;
    }

  10. #10
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Surcoût inutile je pense.

    Rebinding : http://alp.developpez.com/tutoriels/templaterebinding/ sauf que dans ton cas c'est avec un paramètre int

    Nested template class : une classe template interne à une autre, i.e définie à l'intérieur d'une autre.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Alp Voir le message
    Surcoût inutile je pense.
    Heuuu... je ne vois pas où apparait le surcoût dans le méthode de nogame: au final, seul un int est déclaré non ? (à moins que des methodes soient sur-appelées, mais les constructeur étant de bas inline...).

    Au passage, est-il possible de rendre une classe (comme angle_base) inaccessible ?


    Citation Envoyé par Alp Voir le message
    Rebinding : http://alp.developpez.com/tutoriels/templaterebinding/ sauf que dans ton cas c'est avec un paramètre int
    Je suis désolé, mais où je n'ai pas compris ce qu'était un rebinding, ou je ne vois pas en quoi redéfinir un angle<acycle> sous un nom de type générique pourrais m'être utile... en effet, je ne vois pas en quoi une classe S<T> ayant défini S<U> sous le typedef othertype aurais pour autant acces aux paramètres private de othertype...

    Citation Envoyé par Alp Voir le message
    Nested template class : une classe template interne à une autre, i.e définie à l'intérieur d'une autre.
    ça par contre, ça oblige à avoir un int de plus,donc à augmenter la place prise en mémoire ce que je cherche à éviter.


    Sinon, je rève d'un équivalent de l'encapsulation "package" que définit l'uml...

    cordialement
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  12. #12
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Je disais juste que ce que tu cherches à faire tirais un peu du rebinding avec des int à la place des types, sauf que tu veux introduire une compatibilité.

    Ensuite, le surcoût est dû à l'héritage, on peut s'en passer ici je pense, cf la méthode de David.

  13. #13
    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
    Voici un code qui fait ce que tu demandes: il marche avec G++ 4.3, pas testé avec VSC++.

    Merc à JMB pour l'avoir rendu fonctionel
    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
    #include <iostream>
     
    template<int cycle> class angle 
    { 
    protected: 
        int agl; 
    public:     
        template <int N> struct middleman 
        { 
     
    	friend class ::angle<cycle>;
            int get(const angle<N> a) {return a.agl;}
        private:
    	middleman(){}
        }; 
     
        template <int cycle2> 
        template <int N> 
        friend int ::angle<cycle>::template middleman<N>::get(const angle<N>); 
     
    public: 
        angle(int a=0){agl=a;}; 
     
        template<int acycle> angle(angle<acycle> a) 
        { 
    	agl=middleman<acycle>().get(a); 
        } 
     
    }; 
     
    int main()
    {
        angle<5> aa(10);
        angle<6> bb(aa);
        angle<42> cc(bb);
    //    angle<42>::middleman<6>().get(bb);
    	return 0;
    }
    Ce code évite ce genre de chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        angle<42>::middleman<6>().get(bb);
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    hmmm... VC++ n'aprécie pas faudrai que je boot sous linux pour tester ça (mais j'ai pas internet depuis, donc on verra plus tard.

    par contre, je ne comprend pas tout le code:je suppose que ceci a pour but d'éviter que midleman ne soit appelé par une classe non friend. Par-contre, la "construction" de midleman n'est-elle pas coûteuse ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <int cycle2> 
        template <int N> 
        friend int
    heu, je suppose que cycle2 est un oubli vu qu"on ne l'utilise pas dans la suite. D'autre part, je ne connaissait pas les "friend template". qu'est-ce que cela sgnifie exactement ? est-ce comme une fonction template ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend int ::angle<cycle>
    heu.... à quoi servent les "::" quelle différence avec un angle<cycle> ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    angle<cycle>::template middleman<N>
    Là, je ne vois pas du tout ce que signifie ce template...


    bref, si vous pouviez éclairer ma bien terne lanterne, je vous en serais reconnaissant, je me sent un peu perdu dans tout ce code...


    Merci


    EDIT:
    Citation Envoyé par alp
    Ensuite, le surcoût est dû à l'héritage
    heu, en quoi le fait d'hériter d'un aglebase ne contenant qu'un int n'étant muni que d'un constructeur pour cet int entraîne t'il un surcoût ? (je sent que l'ignare que je suis va se faire taper sur les doigts).
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  15. #15
    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
    Citation Envoyé par méphistopheles Voir le message
    hmmm... VC++ n'aprécie pas faudrai que je boot sous linux pour tester ça (mais j'ai pas internet depuis, donc on verra plus tard.
    Arf, quelles sont les erreurs ?

    Citation Envoyé par méphistopheles Voir le message
    par contre, je ne comprend pas tout le code:je suppose que ceci a pour but d'éviter que midleman ne soit appelé par une classe non friend. Par-contre, la "construction" de midleman n'est-elle pas coûteuse ?
    Pour moi, elle n'est pas couteuse

    En ce qui concerne la déclaration d'amitié, je ne comprends pas tout moie même, il faudrait que l'auteur (jean marc bourget) passe ici.

    Citation Envoyé par méphistopheles Voir le message
    EDIT: heu, en quoi le fait d'hériter d'un aglebase ne contenant qu'un int n'étant muni que d'un constructeur pour cet int entraîne t'il un surcoût ? (je sent que l'ignare que je suis va se faire taper sur les doigts).
    Il y'a surcout car il y a appel du constructeur.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Arf, quelles sont les erreurs ?
    heu... bon, je les met, mais ce n'est pas grave puisqu'au final, le projet sera compilé sous gcc.
    Le seul problème est que ma carte wifi n'arrivant pas a être reconnue par linux, je code sous windows pour avoir internet quand je n'ai pas de conexion physique (ce qui et le cas actuellement).

    enfin si tu veux les erreurs, je te les met, mais elles ne sont pas tres explicites...
    Citation Envoyé par débogueur VC++
    1>------ Début de la génération : Projet : bart, Configuration : Debug Win32 ------
    1>Compilation en cours...
    1>main.cpp
    1>.\main.cpp(31) : warning C4346: 'angle<cycle>::middleman<N>::get' : le nom dépendant n'est pas un type
    1> préfixer avec 'typename' pour indiquer un type
    1> .\main.cpp(41) : voir la référence à l'instanciation de la classe modèle 'angle<cycle>' en cours de compilation
    1>.\main.cpp(31) : error C2998: '`global namespace'::angle<cycle>::middleman<N>::get get' : ne peut pas être une définition de modèle
    1>.\main.cpp(34) : error C2955: 'angle' : l'utilisation d'une classe modèle requiert une liste d'arguments modèle
    1> .\main.cpp(41) : voir la déclaration de 'angle'
    1>.\main.cpp(34) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>.\main.cpp(34) : error C2864: 'angle<cycle>::agl' : seules les données membres static const intégrales peuvent être initialisées dans une classe
    1>.\main.cpp(31) : error C2063: 'get' : n'est pas une fonction
    1> .\main.cpp(45) : voir la référence à l'instanciation de la classe modèle 'angle<cycle>' en cours de compilation
    1> with
    1> [
    1> cycle=5
    1> ]
    1>.\main.cpp(31) : warning C4346: 'angle<cycle>::middleman<N>::get' : le nom dépendant n'est pas un type
    1> with
    1> [
    1> cycle=5
    1> ]
    1> préfixer avec 'typename' pour indiquer un type
    1>.\main.cpp(31) : error C2998: '`global namespace'::angle<cycle>::middleman<N>::get get' : ne peut pas être une définition de modèle
    1> with
    1> [
    1> cycle=5
    1> ]
    1>.\main.cpp(34) : error C2955: 'angle' : l'utilisation d'une classe modèle requiert une liste d'arguments modèle
    1> .\main.cpp(41) : voir la déclaration de 'angle'
    1>.\main.cpp(34) : error C2065: 'a' : identificateur non déclaré
    1>.\main.cpp(34) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>.\main.cpp(34) : error C2864: 'angle<cycle>::agl' : seules les données membres static const intégrales peuvent être initialisées dans une classe
    1> with
    1> [
    1> cycle=5
    1> ]
    1>.\main.cpp(31) : error C2063: 'get' : n'est pas une fonction
    1> .\main.cpp(46) : voir la référence à l'instanciation de la classe modèle 'angle<cycle>' en cours de compilation
    1> with
    1> [
    1> cycle=6
    1> ]
    1>.\main.cpp(31) : warning C4346: 'angle<cycle>::middleman<N>::get' : le nom dépendant n'est pas un type
    1> with
    1> [
    1> cycle=6
    1> ]
    1> préfixer avec 'typename' pour indiquer un type
    1>.\main.cpp(31) : error C2998: '`global namespace'::angle<cycle>::middleman<N>::get get' : ne peut pas être une définition de modèle
    1> with
    1> [
    1> cycle=6
    1> ]
    1>.\main.cpp(34) : error C2955: 'angle' : l'utilisation d'une classe modèle requiert une liste d'arguments modèle
    1> .\main.cpp(41) : voir la déclaration de 'angle'
    1>.\main.cpp(34) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>.\main.cpp(34) : error C2864: 'angle<cycle>::agl' : seules les données membres static const intégrales peuvent être initialisées dans une classe
    1> with
    1> [
    1> cycle=6
    1> ]
    1>.\main.cpp(31) : error C2063: 'get' : n'est pas une fonction
    1> .\main.cpp(47) : voir la référence à l'instanciation de la classe modèle 'angle<cycle>' en cours de compilation
    1> with
    1> [
    1> cycle=42
    1> ]
    1>.\main.cpp(31) : warning C4346: 'angle<cycle>::middleman<N>::get' : le nom dépendant n'est pas un type
    1> with
    1> [
    1> cycle=42
    1> ]
    1> préfixer avec 'typename' pour indiquer un type
    1>.\main.cpp(31) : error C2998: '`global namespace'::angle<cycle>::middleman<N>::get get' : ne peut pas être une définition de modèle
    1> with
    1> [
    1> cycle=42
    1> ]
    1>.\main.cpp(34) : error C2955: 'angle' : l'utilisation d'une classe modèle requiert une liste d'arguments modèle
    1> .\main.cpp(41) : voir la déclaration de 'angle'
    1>.\main.cpp(34) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>.\main.cpp(34) : error C2864: 'angle<cycle>::agl' : seules les données membres static const intégrales peuvent être initialisées dans une classe
    1> with
    1> [
    1> cycle=42
    1> ]
    1>Le journal de génération a été enregistré à l'emplacement "file://c:\Dossiers & progs\Rems\Archives et documents\2008-2009\Robot\prog\Barth\VCtest\bart\bart\Debug\BuildLog.htm"
    1>bart - 20 erreur(s), 4 avertissement(s)
    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

    Citation Envoyé par Davidbrcz Voir le message
    En ce qui concerne la déclaration d'amitié, je ne comprends pas tout moie même, il faudrait que l'auteur (jean marc bourget) passe ici.
    je lui ai envoyé un mp pour favoriser la chance

    Citation Envoyé par Davidbrcz Voir le message
    Il y'a surcout car il y a appel du constructeur.
    ah, ok. du coup, l'int est recopié dans l'argument du constructeur de anglebase avant d'être recopié dans agl (en plus d'être copié dans l'argument du constructeur de angle).


    merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Alp Voir le message
    Je disais juste que ce que tu cherches à faire tirais un peu du rebinding avec des int à la place des types, sauf que tu veux introduire une compatibilité.

    Ensuite, le surcoût est dû à l'héritage, on peut s'en passer ici je pense, cf la méthode de David.
    Quel surcoût ? Il n'y a pas de surcoût dans ce cas

  18. #18
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Il y'a surcout car il y a appel du constructeur.
    C'est pas parce qu'il y a un constructeur en plus qu'il y a surcoût. Si celui-ci fait uen partie du constructeur original, en inline il n'y a aucun surcoût.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    C'est pas parce qu'il y a un constructeur en plus qu'il y a surcoût. Si celui-ci fait uen partie du constructeur original, en inline il n'y a aucun surcoût.
    mais vu que les paramètres du constructeurs sont passés en int, n'y -a t'il pas de recopie mutiple de la valeur ?


    sinon, l'appel d'un constructeur vide prend-il du temps ? par-ce que si non, on peut se contenter de ne créer qu'un constructeur vide.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  20. #20
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    mais vu que les paramètres du constructeurs sont passés en int, n'y -a t'il pas de recopie mutiple de la valeur ?


    sinon, l'appel d'un constructeur vide prend-il du temps ? par-ce que si non, on peut se contenter de ne créer qu'un constructeur vide.
    Si c'est inlinable, le compilateur se débrouille pour que ça n'ait aucun surcoût.

    Et un constructeur vide, c'est un surcoût nul si c'est inlinable.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/03/2015, 16h34
  2. Réponses: 32
    Dernier message: 28/11/2010, 17h33
  3. Instance d'une classe avec une string
    Par beetlejuice722 dans le forum C#
    Réponses: 30
    Dernier message: 31/10/2008, 10h43
  4. Envoyer un message a toutes instances d'une class
    Par toure32 dans le forum Delphi
    Réponses: 2
    Dernier message: 18/11/2006, 20h06
  5. Réponses: 2
    Dernier message: 07/07/2006, 19h59

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