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 :

[VC++ 6] Problème de déclaration de template


Sujet :

Langage C++

  1. #1
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut [VC++ 6] Problème de déclaration de template
    Bonsoir,

    j'utilise pour le 1ère fois les templates (car je m'inspire d'un code que j'ai trouvé)
    je définis la classe Vector:

    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
     
    template<
    	class		T = double,	// Type of the components
    	const int		n		// Cardinality of the vector
    >
    class Vector
    {
    protected:
    	T			v[n];
     
     
    public:
    	Vector()
    	{
     
    	}
     
     
    etc...etc
     
    };
    puis la classe Matrix
    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
     
     
    template<
    	class			T = double,	// Type of the components
    	const int		n,		// Rows
    	const int		m		// Cols
    >
    class Matrix
    {
    protected:
    	Vector<T,m>		M[n];
     
     
    public:
    	Matrix()
    	{
    	}
     
     
    etc...etc
     
    };
    La classe Vector est parfaitement compilée
    mais la classe Matrix, pourtant similaire, me donne l'erreur :
    error C2233: '<Unknown>' : arrays of objects containing zero-size arrays are illegal
    à la ligne "Vector<T,m> M[n];"

    Je tourne en rond : évidemment la taille n'est pas encore spécifiée, j'en suis qu'à la définition de la classe !

    Comment m'en sortir ?
    Merci d'avance
    Philippe

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<
    	class		T = double,	// Type of the components
    	const int		n		// Cardinality of the vector
    >
    Vu que tu as un truc par défaut pour T, il est obligé de mettre des arguments par défaut pour n, donc ici 0.

    Même chose:
    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
    template<
    	class			T = double,	// Type of the components
    	const int		n,		// Rows
    	const int		m		// Cols
    >
    class Matrix
    {
    protected:
    	Vector<T,m>		M[n];
     
     
    public:
    	Matrix()
    	{
    	}
    };
    Il comprend ce code comme:

    Code C++ : 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
    template<
    	class			T = double,	// Type of the components
    	const int		n=0,		// Rows
    	const int		m=0		// Cols
    >
    class Matrix
    {
    protected:
    	Vector<T,m>		M[n];
     
    	
    public:
    	Matrix()
    	{
    	}
    };

    Ce que tu peux faire, c'est enlever le "=double" après ton T.

  3. #3
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut
    Merci pour ton explication qui était logique, mais qui ...
    marche pô ...

    j'ai même essayé ça :
    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
     
    template<
    	class	       T =float,	// Type of the components
    	 int		n=13,		// Rows
    	 int		m=13		// Cols
    >
    class Matrix
    {
    protected:
     
    	Vector<T,m>		M[n];
     
     
    public:
    	Matrix()
    	{
    	}
     
    };
    mais ça ne marche pas non plus

    il n'y a que ça qui passe :
    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
     
    template<
    	class		T,	// Type of the components
    	 int		n,		// Rows
    	 int		m		// Cols
    >
    class Matrix
    {
    protected:
     
    	Vector<T,13>		M[13];
     
     
     
    public:
    	Matrix()
    	{
    	}
     
    };
    mais ça enlève toute la fléxibilité de la manip.
    Je ne comprends pas pourquoi il accepte mon template Vector, que je peux définir un vecteur comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Vector<float,3> P;
    et qu'il me jette pour le template Matrix


    Philippe

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Désolé mais avec mon compilateur ça marche parfaitement...

    Ce que tu peux essayer de faire, c'est de rajouter dans la déclaration de Vector:

    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
    template<
    	class		T = double,	// Type of the components
    	const int		n=13		// Cardinality of the vector
    >
    class Vector
    {
    protected:
    	T			v[n];
     
     
    public:
    	Vector()
    	{
     
    	}
    };
    Même si avec mon compilo j'ai pas besoin...

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Juste une remarque, que l'on fait souvent mais qui est suffisamment importante pour être rappelée: c'est une grosse erreur d'utiliser VC6. Le complilateur (visual toolkit 2) de cet IDE est celui qui s'éloigne le plus de la norme. Il est trés dangereux de l'utiliser, car on peut presque dire qu'il ne compile pas du c++.

    Je conseille fortement d'utiliser visual 8 (dont il existe une version gratuite, visual express edition), ou un IDE open source, comme Code::Blocks par exemple. Sachant que le problème avec la série des visual (MS) c'est qu'on ne peut pas choisir le compilateur.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Juste une remarque, que l'on fait souvent mais qui est suffisamment importante pour être rappelée: c'est une grosse erreur d'utiliser VC6.
    Oui, il en existe une entrée dans la FAQ.
    http://cpp.developpez.com/faq/vc/?pa...VC6Limatations

  7. #7
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut
    Pour répondre à Coyotte507 :
    ta solution m'embête car elle fixe la dimension du vecteur alors que dans mon code, j'ai plusieurs vecteurs de dimensions différentes: je perds donc en souplesse :

    en essayant pendant des heures, j'ai résolu le problème :
    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
     
    template<
    	class	 T,	// Type of the components
    	 int		n,		// Rows
    	 int		m		// Cols
    >
    class Matrix
    {
     
    protected:
    		Vector<float,m>		M[n];
     
     
    public:
    	Matrix()
    	{
    	}
    };
    j'ai fixé le type de Vector (float au lieu de T): ça, ça ne me gène pas pour la suite, car j'ai une dimension qui sera différente pour chaque instanciation.

    ça compile correctement, mais ça doit confirmer les remarques de r0d et aoyou: sûrement un problème de compilateur ....

    Merci pour le temps passé
    Philippe

  8. #8
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut
    je sais bien, VC++ 6 est sûrement vieillot etc etc...

    mais je n'ai jamais su clairement si les MFC sont compatibles avec les versions ultérieures. (il faudrait que je pose clairement la question sur le forum MFC)

    or tout mon projet est basé sur les MFC que je commence à bien connaitre.

    passer des jours et des nuits à voir le compilo planter me décourage ....
    même si j'y gagnerai au final

    un jour sûrement, mais pas maintenant
    merci de vos réponses, joyeuses fêtes
    Philippe

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Hmm oui, si tu utilises la MFC c'est plus compliqué de changer d'IDE, car la MFC est une lib propriétaire, et elle n'est pas fournie avec les versions gratuites (express editions) de visual. Et j'avoue ne rien savoir à propos de la compatibilité entre versions de la MFC.

  10. #10
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    @philippe320:

    quand on fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<class T = double> maclasse;
    ça ne fixe pas le type de T à double, ça lui attribue juste une valeur par défaut qui est double, mais on peut parfaitement faire une instance maclasse<int>.

    Citation Envoyé par coyotte507
    Ce que tu peux faire, c'est enlever le "=double" après ton T.
    Ca valait aussi pour le double de vector

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [template] problème de déclaration
    Par kango dans le forum Débuter
    Réponses: 1
    Dernier message: 04/08/2011, 10h42
  2. Problème déclaration classe template
    Par olivier1978 dans le forum Langage
    Réponses: 3
    Dernier message: 21/11/2007, 23h43
  3. problème de déclaration de templates
    Par porco dans le forum C++
    Réponses: 4
    Dernier message: 14/10/2006, 21h12
  4. Réponses: 11
    Dernier message: 29/04/2005, 19h45
  5. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 10h17

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