Partage
  • Partager sur Facebook
  • Partager sur Twitter

Inclure une Classe dans un template

    28 janvier 2019 à 21:08:25

    Coucou tout le monde,

    j'ai un problème avec un Template que je suis en train de créer, en effet c'est un Template de Matrice 2D qui doit pouvoir se spécialiser pour des objet "Tile", j'ai suivis 2 cours en parallèles (OpenClassroom C++ et celui de Sololearn, une appli qui donne des mini condensé de programmation). Mais j'ai un problèmes : dans la classe de template spécialisée , le T utilisé en tant que "typename" n'est plus reconnu :/ Voici le Code concerné : 

    #ifndef MATRICE2D_H_INCLUDED
    #define MATRICE2D_H_INCLUDED
    #include "Tile.h"
    #include <vector>
    #include <fstream>
    #include <string>
    
    template<typename T>
    class Matrice2D
    {
    
    int m_sizeX;
    int m_sizeY;
    std::vector<T> m_data;
    std::ifstream m_ifStream;
    std::ofstream m_ofStream;
    
    
    public:
    
        Matrice2D(int sizeX,int sizeY,std::string fileName):
        m_sizeX(sizeX),
        m_sizeY(sizeY),
        m_data(sizeX*sizeY)
    
    {
        //---IFSTREAM---
    
        int id;
        m_ifStream.open(fileName);
        m_ofStream.open(fileName);
        for(int x=0;x<=sizeX;x++)
        {
         m_ifStream>>id;
         m_data[x];
        }
    }
    };
    
    
    //---Matrice2D -> Tile
    
    template<>
    class Matrice2D<Tile>
    {
    
    int m_sizeX;
    int m_sizeY;
    std::vector<T> m_data;
    std::ifstream m_ifStream;
    std::ofstream m_ofStream;
    
    
    public:
    
        Matrice2D(int sizeX,int sizeY,std::string fileName):
        m_sizeX(sizeX),
        m_sizeY(sizeY),
        m_data(sizeX*sizeY)
    
    {
        //---IFSTREAM---
    
        int id;
        m_ifStream.open(fileName);
        m_ofStream.open(fileName);
        for(int x=0;x<=sizeX;x++)
        {
         m_ifStream>>id;
         m_data[x];
        }
    }
    };
    
    
    
    
    #endif // MATRICE2D_H_INCLUDED
    

    Et la ligne concerné par l'erreur : 

    template<>
    class Matrice2D<Tile>
    {
    
    int m_sizeX;
    int m_sizeY;
    std::vector<T> m_data;     //"T was not declared in this scope"
    std::ifstream m_ifStream;

    Merci de votre aide 

    • Partager sur Facebook
    • Partager sur Twitter
      28 janvier 2019 à 22:06:54

      Bonjour,

      Pour ton erreur, elle semble claire : "c'est quoi ce T qui est indiqué ici?" Tu es en train de spécialiser un template, il correspond à un cas particulier de son paramètre. Donc ici c'est un cas particulier pour Tile, on pourrait avoir n'importe quelle ligne comme std::map<char,Tile> m_data; et là le compilateur accepterait, ou aussi std::vector<Tile> m_data;.

      Il y a des lignes "curieuses" dans ton code comme par exemple : m_data[x];.

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        28 janvier 2019 à 22:41:30

        Ah oui! Erreur vraiment stupide ^^', mais j'ai un nouveaux problème : le compilateur me renvoi vers "stl_construct.h" fichier que je ne connais pas, et m'indique :

        "error: no matching function for call to 'Tile::Tile()'|"

        Alors là par contre je sèche : comment créer un objet membre dans la partie "private" sans avoir à l'instancier avec un constrcteur? En tant que valeur null?

        • Partager sur Facebook
        • Partager sur Twitter
          29 janvier 2019 à 8:49:19

          Ça veut juste dire qu'il essaye d'appeler le constructeur par défaut. C'est un des prérequis de certaines fonctions de la map.

          Tu dois en déclarer un.

          Matrice2D() = default;

          C'est par exemple nécessaire pour l'operator[].

          Si tu ne peux/veux vraiment pas déclarer un constructeur par défaut, tu peux toujours insérer des éléments avec emplace/insert à la place.

          Par contre pour être tout à fait franc, je pense pas que ce soit la responsabilité d'une matrice de lire un fichier pour se peupler. En effet, la matrice devrait simplement contenir des données et des fonctions de calcul. Comment elle est remplie elle n'a pas besoin de le savoir et ce pourrait être une simple fonction libre qui te créé une matrice depuis un fichier.

          Matrice2D from_file(const std::string& path)
          {
              // ouverture + lecture + return.
          }

          -
          Edité par markand 29 janvier 2019 à 8:53:46

          • Partager sur Facebook
          • Partager sur Twitter

          git is great because Linus did it, mercurial is better because he didn't.

            29 janvier 2019 à 11:21:47

            Salut,

            Par contre, m_ifstream et m_ofstream n'ont absolument rien à faire dans ta classe Marice!!!

            • Partager sur Facebook
            • Partager sur Twitter
            Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait

            Inclure une Classe dans un template

            × 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