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 :

Erreur compilation ne recconnait pas classe comme type


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Erreur compilation ne recconnait pas classe comme type
    Bonjour à tous, et d'abord merci de vous interresser à mon problème.
    Alors voilà, je réalise un programme de matrice, dans lequel je surcharge des opérateurs, le compilateur m'indique une erreur : " expected constructor, destructor or type conversion before 'matrice' ".
    Voici le ".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
    33
    class matrice
    {
    	protected :
     
    		T** mat;
    		int ligne,colonne;
     
    	public :
     
    		matrice(int _ligne, int _colonne);
    		matrice(const matrice& m);
    		//matrice &operator=(const matrice &m);
    		~matrice();
    		T getLigne();
    		T getColonne();
    		void setValeur(T _valeur, int _ligne, int _colonne);
    		T getValeur(int _ligne, int _colonne);
    		void LireFichier(string S);
    		void setLigne(int _ligne);
    		void setColonne(int _colonne);
    		matrice &operator+(const matrice &m);
    		matrice &operator-(const matrice &m);
    		friend ostream &operator<<(ostream & flux, matrice & m)
    		{
    			for(int i=0 ; i<(m.getLigne()) ; i++)
    			{
    			flux<<setw(3)<<'|';
    			for(int j=0 ; j<(m.getColonne()) ; j++) flux<<" "<<setw(3)<<m.getValeur(i,j);
    			flux<<" "<<setw(3)<<'|'<<endl;
    			}
    			return flux;
    		}
    };


    Voici le ".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
    template <typename T>
    matrice matrice<T>::&operator+(const matrice &m) // ERREUR SUR CETTE LIGNE
    {
    	if(ligne!=m.ligne || colonne!=m.colonne) return 0;
    	else 
    	{
    		matrice resultat(ligne,colonne);
    		for(int i=0 ; i<ligne ; i++)
    			for(int j=0 ; j<colonne ; j++)
    				resultat[i][j]=mat[i][j]+m.mat[i][j];
    	}
    	return resultat;
    }
     
    template <typename T>
    matrice matrice<T>::&operator-(const matrice &m) // ERREUR SUR CETTE LIGNE
    {
    	if(ligne!=m.ligne || colonne!=m.colonne) return 0;
    	else 
    	{
    		matrice resultat(ligne,colonne);
    		for(int i=0 ; i<ligne ; i++)
    			for(int j=0 ; j<colonne ; j++)
    				resultat[i][j]=mat[i][j]-m.mat[i][j];
    	}
    	return resultat;
    }

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Citation Envoyé par mrpignol
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class matrice
    {
    	protected :
     
    		T** mat;
    Tu utilise une classe template sans définir T :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename T>
    class matrice
    {
    	protected :
     
    		T** mat;
    Comment créer une classe template ?

  3. #3
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Ne pas déclarer les fonctions templates membre de ta classe dans le .cpp

    Pourquoi mes templates ne sont-ils pas reconnus à l'édition des liens ?

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Excuse je n'avais pas tout sélectionné, j' ai effectivement cette déclaration de template. Donc l'erreur ne vient pas de là.

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Je pense que l'erreur vient du type de retour "matrice", ça doit pas tellement aller au compilateur.

  6. #6
    fd
    fd est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    Normal il essaie de construire matrice() (sans paramétres) qui n'existe pas
    Defini un constructeur par defaut

  7. #7
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Pour être exact et compléter ma réponse précédente, il existe le mot clé "export" pour compiler une fonction template dans un .cpp

    Le problème est que beaucoup de compilateurs ne supportent pas ce mot clé.

    Plus d'information

    FAQ export

    Petit point inexact de la FAQ que je voulais vérifier
    Note : Aucun compilateur ne gère le mot clé export à ce jour
    Ce n'est pas totalement vrai, ils sont peu mais il en existe, j'en connaissais un "Comeau C++", mais il semble que "Borland C++ Builder X" le supporte aussi actuellement

    http://en.wikipedia.org/wiki/C++#Pro..._controversies

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Alors voilà ce que je rajoute, il me semble que ce constructeur soit correcte, pourtant le compilateur me met toujours la même erreure donc toujours bloqué.


    template <typename T>
    matrice<T>::matrice()//:mat(0),ligne(0),colonne(0)
    {}

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci à tous de vos réponses.
    Ti-R, j' ai poursuivi ton lien et me suis intéressé à ce problème. Cela veut dire que si toutes mes méthodes sont template, je n'aurai plus de '.cpp', c'est pas que ça m'affole, mais cela me parrait juste un peu bizarre.
    Alors selon toi, je mets la déclaration de mes méthodes et directement leur définition dans ce même fichier, mais où? --> dans la classe, juste après la déclaration
    -->en dehors de la classe.

    Merci de tes réponses passées et futures.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par fd
    Normal il essaie de construire matrice() (sans paramétres) qui n'existe pas
    Defini un constructeur par defaut
    Non, l'erreur ne serait pas celle qui est citée. Dans ce cas, le compilo dirait qu'il ne trouve pas de constructeur sans paramètre.
    En plus, sur les lignes qui posent problème, il n'y a aucune construction d'instance.

    Ce genre d'erreur me rappelle de mauvais souvenirs car je l'ai souvent eue sur des classes templates. Pour moi, la meilleure solution était de définir les méthodes directement dans le .h. Je me demande pourquoi tu ne fais pas cela : peut-être ne peux tu pas exposer ton code dans l'en-tête, pour des raisons de confidentialité du code ?

    Sinon, il me semble que écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    matrice matrice<T>::&operator+(const matrice &m)
    n'est pas suffisant, il manque des paramètres templates à "matrice" pour définir un type.
    Essaie qqch comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    matrice<T> matrice<T>::&operator+(const matrice<T> &m)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par mrpignol
    Merci à tous de vos réponses.
    Ti-R, j' ai poursuivi ton lien et me suis intéressé à ce problème. Cela veut dire que si toutes mes méthodes sont template, je n'aurai plus de '.cpp', c'est pas que ça m'affole, mais cela me parrait juste un peu bizarre.
    Alors selon toi, je mets la déclaration de mes méthodes et directement leur définition dans ce même fichier, mais où? --> dans la classe, juste après la déclaration
    -->en dehors de la classe.
    Implémente tes méthodes dans la déclaration de la classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class T> class MaClasseTemplate
    {
          void UneFonction()
          {
                // La tripaille.
          }
    }
    Ca aura l'avantage d'alléger les écritures et de causer moins d'erreurs de compil'...
    Et tu n'as pas d'inquiétude à avoir à dégager le .cpp : une classe template n'est pas compilée (comment le compilo pourrait compiler un type qui n'est pas parfaitement défini ?) : le code template est "recopié" par le compilo lorsque tu utilise les méthodes de la classe.

  12. #12
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par Ti-R
    Ne pas déclarer les fonctions templates membre de ta classe dans le .cpp

    Pourquoi mes templates ne sont-ils pas reconnus à l'édition des liens ?
    Soit faire comme l'indique dabeuliou, soit regarder le lien que j'ai posté avant sur la FAQ. Le principe tout mettre dans le .h, ce n'est pas très propre, mais cela ce fait ainsi.

    Il y a moyen de mettre cela dans le .cpp mais il faut instancier les templates à la main pour chaque type.

    Sinon tu peux placer ton code dans un fichier autre que .h et .cpp/.cc, exemple .def
    Et inclure le fichier après la déclaration de ta class dans le .h

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ce n'est pas totalement vrai, ils sont peu mais il en existe, j'en connaissais un "Comeau C++", mais il semble que "Borland C++ Builder X" le supporte aussi actuellement
    En fait c'est parce que ces deux compilateurs sont basés sur le frontend EDG (tout comme le compilateur Intel), qui est le seul à supporter export.

  14. #14
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Voilà ma modification, je l'ai juste fait sur le premier cas d'erreur :

    class matrice
    {
    protected :

    T** mat;
    int ligne,colonne;

    public :

    matrice();
    matrice(int _ligne, int _colonne);
    matrice(const matrice& m);
    matrice & operator=(matrice &m) // ERREUR ICI
    {
    if(this->getLigne()!=m.ligne || this->getColonne()!=m.colonne) return 0;
    else {
    for(int i=0 ; i<m.ligne-1 ; i++)
    for(int j=0 ; j<m.colonne-1 ; j++)
    mat[i][j]=m.mat[i][j];
    return *this;
    }
    }
    ~matrice();
    T getLigne();
    T getColonne();
    void setValeur(T _valeur, int _ligne, int _colonne);
    T getValeur(int _ligne, int _colonne);
    void LireFichier(string S);
    void setLigne(int _ligne);
    void setColonne(int _colonne);
    matrice &operator+(const matrice &m);
    matrice &operator-(const matrice &m);
    matrice &operator*(const matrice &m);
    matrice scalaire(const int num);
    };

    Voici l'erreur du compilo :

    matrice.h: In member function ‘matrice<T>& matrice<T>::operator=(matrice<T>&) [with T = int]’:
    main.cpp:11: instantiated from here
    matrice.h:24: erreur: invalid initialization of non-const reference of type ‘matrice<int>&’ from a temporary of type ‘int’
    make: *** [main.o] Erreur 1

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Renvoyer 0 en tant que matrice&, je doute que le compilo s'y retrouve.

    Ton opérateur = ne devrait pas tester les dimensions de la matrice affectée, si elles sont différentes il devrait simplement recréer le tableau avec ces nouvelles dimensions. En tout cas c'est ce qu'on attendrait d'un opérateur d'affectation.

    Ti-R : ce que tu cites n'est pas la FAQ, c'est un cours de C++ qui n'est pas forcément à jour concernant les compilos qui supportent export

  16. #16
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par Laurent Gomila
    Ti-R : ce que tu cites n'est pas la FAQ, c'est un cours de C++ qui n'est pas forcément à jour concernant les compilos qui supportent export
    Oups désolé
    Merci pour l'information Laurent

  17. #17
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Ti-R
    Ce n'est pas totalement vrai, ils sont peu mais il en existe, j'en connaissais un "Comeau C++", mais il semble que "Borland C++ Builder X" le supporte aussi actuellement

    http://en.wikipedia.org/wiki/C++#Pro..._controversies
    Intel le gère aussi (toujours avec le front end EDG).

Discussions similaires

  1. [IP-2010] Erreur: Section ne peut pas stocker le type de données lié
    Par MrMeteo dans le forum InfoPath
    Réponses: 1
    Dernier message: 06/06/2014, 08h56
  2. [TALEND] n'est pas reconnu comme type valide
    Par Syphys dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 27/01/2011, 10h43
  3. je ne trouve pas office comme type de projet
    Par sanach dans le forum Framework .NET
    Réponses: 6
    Dernier message: 13/02/2008, 17h07
  4. [VBA] erreur compil si pas Outlook
    Par cbleas dans le forum Access
    Réponses: 2
    Dernier message: 25/08/2006, 16h34
  5. Classe template - erreur compilation
    Par Rodrigue dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2006, 18h26

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