Partage
  • Partager sur Facebook
  • Partager sur Twitter

Serpent (Ou plutôt Template) qui se mord la queue

    22 août 2021 à 15:54:16

    Bonjour à tous,

    Je suis embêté par trois classe qui dépendent les unes des autres et qui utilisent les Templates afin de pouvoir spécifier différents types d'allocateurs mémoire:

    template<typename _Alloc = std::allocator<Receiver*>>
    class Neuron;
    
    template<typename _Alloc = std::allocator<Receiver*>>
    class Axon;
    
    class Receiver
    {
        Receiver(Neuron &neuron, Axon& ax) { ... }
    }
    
    template<typename _Alloc>
    class Axon
    {
        std::vector<Receiver*, _Alloc> m_receivers:
    }
    
    template<typename _Alloc>
    class Neuron
    {
       Axon<_Alloc> m_axon;
    }

    Le problème ici est que bien évidemment le constructeur de la classe Receiver devrait être Receiver(Neuron<_Alloc> &neuron, Axon<_Alloc>& ax) { ... }, sauf que je n'arrive pas à trouver la déclaration de classe adaptée pour faire cela, étant donné que la classe Receiver fait partie de la Template... Quelqu'un aurait-il une solution ?

    Merci de m'avoir lu 

    • Partager sur Facebook
    • Partager sur Twitter
      22 août 2021 à 17:48:31

      Bonjour,

      Neuron et Axon ne sont pas des classes, ce sont des templates de classe, ce ne sont donc pas des types et ne peuvent pas être paramètres de fonction. Il faut définir la class Receiver comme template ou à minima le constructeur comme tel.

      class Receiver
      {
          template<typename A1,typename A2>  // Seul le constructeur est template
          Receiver( Neuron<A1>&  neuron, Axon<A2>&  ax ) { ... }
      };
      
      // ou bien c'est toute la classe qui dépend des 2 allocators
      
      template<typename A1,typename A2> // toute la classe est template et dépend des 2 allocateurs
      class Receiver
      {
          Receiver( Neuron<A1>&  neuron, Axon<A2>&  ax ) { ... }
      };
      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        22 août 2021 à 18:51:28

        Salut et merci de la réponse,

        J'ai bien compris que l'allocateur voulu devait apparaître comme argument Template dans la classe Receiver (C'est la solution 2 d'ailleurs car la classe contient plusieurs membres Axon et Neuron), mais mon problème c'est faire les déclarations. En effet, si j'utilise :

        template<typename A1,typename A2> // toute la classe est template et dépend des 2 allocateurs
        class Receiver
        {
            Receiver( Neuron<A1>&  neuron, Axon<A2>&  ax ) { ... }
        };

        Alors les déclarations :

        template <typename A1, typename A2>
        class Receiver;
        
        template<typename _Alloc = std::allocator<Receiver<_Alloc, _Alloc>*>>
        class Neuron;
         
        template<typename _Alloc = std::allocator<Receiver<_Alloc, _Alloc>*>>
        class Axon;

        Ne sont pas valides. Comment déclarer cela ?



        -
        Edité par parcoursupdedicated 22 août 2021 à 18:55:23

        • Partager sur Facebook
        • Partager sur Twitter
          22 août 2021 à 20:40:40

          Il faudrait préciser l'erreur que tu obtiens.
          Seule obligation; tu ne peux pas mettre la définition de Receiver avant la déclaration de Axon et Neuron car Receiver en à besoin, le chronologie doit être :

          template<typename _Alloc = std::allocator<Receiver<_Alloc, _Alloc>*>>
          class Neuron;
            
          template<typename _Alloc = std::allocator<Receiver<_Alloc, _Alloc>*>>
          class Axon;
          
          // Puis
          
          template<typename A1,typename A2> // toute la classe est template et dépend des 2 allocateurs
          class Receiver
          {
              Receiver( Neuron<A1>&  neuron, Axon<A2>&  ax ) { ... }
          };

          Les définitions de Neuron et Axon doivent être après leur déclaration (car la déclaration indique une valeur par défaut), et toutes les définitions et déclarations doivent être visibles donc dans un fichier d'entête. 

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            22 août 2021 à 21:17:05

            L'erreur que j'ai avec MSVC est que _Alloc n'est pas défini (Dans la ligne 
            template<typename _Alloc = std::allocator<Receiver<_Alloc, _Alloc>*>>

            )

            Après Receiver (synapse.h) n'est pas défini dans le même fichier .h que Axon et Neuron (neuron.h), mais la déclaration avant de Neuron et Axon est faite dans synapse.h qui est inclu dans neuron.h... (Je peux poster tout le code si ça peut aider)

            • Partager sur Facebook
            • Partager sur Twitter
              24 août 2021 à 19:07:52

              Personne n'a de solutions ? Je n'arrive toujours pas à compiler mon code...
              • Partager sur Facebook
              • Partager sur Twitter

              Serpent (Ou plutôt Template) qui se mord la queue

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown