Problème d'héritage de classes templates

Résolu
emiaille Messages postés 11 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 11 mars 2007 - 10 mars 2007 à 21:37
emiaille Messages postés 11 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 11 mars 2007 - 11 mars 2007 à 16:06
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
11 mars 2007 à 15:37
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
3
emiaille Messages postés 11 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 11 mars 2007
11 mars 2007 à 16:06
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.
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
10 mars 2007 à 22:51
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
0
cs_azamharir Messages postés 55 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 novembre 2008
10 mars 2007 à 23:02
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à.
@++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
emiaille Messages postés 11 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 11 mars 2007
11 mars 2007 à 00:59
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.
0
mad_charif Messages postés 49 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 19 août 2010
11 mars 2007 à 01:16
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 ;)
0
emiaille Messages postés 11 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 11 mars 2007
11 mars 2007 à 14:30
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.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
11 mars 2007 à 14:39
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
0
emiaille Messages postés 11 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 11 mars 2007
11 mars 2007 à 15:20
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.
0
emiaille Messages postés 11 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 11 mars 2007
11 mars 2007 à 15:54
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.
0