Problème d'héritage de classes templates [Résolu]

Signaler
Messages postés
11
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
11 mars 2007
-
Messages postés
11
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
11 mars 2007
-
Bonjour tout le monde,

En ce moment je m'initie aux templates et j'ai donc créer une classe template matrix delaquelle je tire la classe vector par héritage.

Pour simplifier la classe matrix, disons quelle contient une donnée menbre protégée appelée m_rows :

template <typename T>
class matrix
{
    ...
    protected:
        unsigned int m_rows;
}

J'ai ensuite crée la classe vector avec la syntaxe suivante :

template <typename T>
class vector : public matrix<T>
{
    ...
}

Je compile tout ça avec g++ sous windows et j'obtiens les messages suivants dans l'implémentation des fonctions de ma classe vector :

vector.hpp:68: error: 'm_rows' undeclared (first use this function)

J'ai fait quelques recherches sur Google pour trouver des tutoriels sur les templates, aucun ne traite l'héritage des classes templates, je ne suis pas sûr de la synthaxe pour la déclaration de ma classe vector.

Est-ce que quelqu'un a une idée de l'erreur que je pourrais commettre?
Merci et n'hésitez pas à me demander plus de détails si nécessaire.

10 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
En effet avec cette version faut ajouter un petit truc, mais tu va t'amuser si tu dois le faire partout:

template <typename T>
class matrix
{
protected:
  unsigned int m_rows;
};

template <typename T>
class vector : public matrix<T>
{
  void f()
  {
    matrix<T>::m_rows = 2;
  }
};

int main()
{
}

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
11
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
11 mars 2007

Je viens juste de trouver un autre solution utilisée dans la STL livrée avec MinGW (pour info dans le fichier stl_vector.h à la ligne 170).

template <typename T>
class matrix
{
protected:
  unsigned int m_rows;
};

template <typename T>
class vector : public matrix<T>
{
  using matrix<T>::m_rows;

  void f()
  {
    m_rows = 2;
  }
};

int main()
{
}

Ca marche aussi avec MinGW et VC++ 2003.
Je vais pouvoir laisser tranquille mes touches Ctrl, C et V, ouf.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Le programme suivant ne compile pas chez toi?

template <typename T>
class matrix
{
protected:
  unsigned int m_rows;
};

template <typename T>
class vector : public matrix<T>
{
  void f()
  {
    m_rows = 2;
  }
};

int main()
{
}

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
55
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 novembre 2008

salut
la partie du programme que t'as donnée se compile très bien (avec VC6).
donne le reste de l'implementation de vector peut etre que l'erreur vient de là.
@++
Messages postés
11
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
11 mars 2007

Merci à tous les deux.

Je viens d'essayer de compiler le bout de code qu'a fournit [auteurdetail.aspx?ID=19734 vecchio56] et j'ai le même problème que j'avais pu observer avant (d'ailleurs merci l'exemple simple est parfait), l'erreur suivante apparaît :

test.cpp:14: error: 'm_rows' undeclared (first use this function)

Pour info j'utilise g++ de la version 5.1.3 de MinGW sous windows.

Pour répondre à
[auteurdetail.aspx?ID=959350 azamharir], j'ai essayé de compiler exactement le même code avec VC++ 2003 et là miracle ça compile parfaitement.
Donc j'en déduis que ça ne vient pas du reste de l'implémentation mais de différences entre les 2 compilateurs.

Là moi ça me dépasse mais si quelqu'un a une idée, je suis preneur.
Messages postés
49
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
19 août 2010

slt mec
je croix que c pa le code c le compilateur
essai --cygwin-- tu y trouve aussi un gcc 
je travail avec CDT d'eclipse et c ce dernier que j'utilise
 bonne chance a toi ;)
Messages postés
11
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
11 mars 2007

Oui c'est bien ce qu'il me semble, ça vient du compilateur.
A mon avis, le fait d'utiliser cygwin ne m'aidera pas beaucoup puisqu'à
priori ce doit être le même compilateur à 1 ou 2 versions près.

Ce qui m'étonne c'est que le compilateur de GNU/GCC ne comprenne pas, et qu'il est certainement plus restrictif au niveau de la norme que celui de Microsoft.
Ce qui me fait dire que je dois me tromper sur la synthaxe à utiliser pour la déclaration de ma classe vector.

Mais là j'ai du mal à trouver sans cours ni exemple, alors je vais mettre le nez dans la STL livrée avec Mingw pour essayer de trouver la bonne synthaxe. Je posterais la solution si je trouve.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
J'arrive à compiler l'exemple sans problème avec MinGW (je viens d'installer cette version)

Pour info, il n'y a pas de h à syntaxe.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
11
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
11 mars 2007

C'est vrai, il n'y a pas de h à syntaxe, comme quoi, même sur un forum d'informatique on peut prendre une leçon de français, merci.

Je viens de télécharger la version dont tu as mis le lien, j'ai effectivement réussi à compiler avec, mais c'est une version un peu vieille. C'est la version 3.0.0 de MinGW (gcc 3.2.3) alors que la version la plus récente est la 5.1.3 (gcc 3.4.2).

Peut-être que la norme a évolué entre-temps. Est-ce que tu pourrais essayer avec la version 5.1.3? Voilà le lien.

Encore merci.
Messages postés
11
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
11 mars 2007

Merci ça marche nickel avec MinGW et VC++ 2003 en plus.

Par contre t'as raison ça va être la misère à rajouter à chaque fois, je vais avoir une petite série de copier/coller à faire.