10 lignes C++ avec templates qui ne compilent pas

10 lignes C++ avec templates qui ne compilent pas - C++ - Programmation

Marsh Posté le 18-02-2008 à 14:29:40    

Salut à tous,  
 
J'ai un problème avec les lignes de code C++ suivantes qui ne compilent pas :  
 

Code :
  1. template <typename T>
  2. class Parent
  3. {
  4. protected:
  5. int _property;
  6. };
  7. template <typename T>
  8. class Child : public Parent <T>
  9. {
  10. void test () {_property;}
  11. };


 
Je lance la compilation avec la commande g++ -c monFichier.cpp sous Cygwin.
 
Version de g++ : 3.4.4
 
A noter que ça ne compile pas non plus avec la v3.4.2 de g++ sous Sun Solaris; en revanche ça compile sous Windows avec Visual Studio v6.0.
 
J'ai l'erreur suivante :  
 

Code :
  1. monFichier.cpp: In member function `void Child<T>::test()':
  2. monFichier.cpp:13: error: `_property' undeclared (first use this function)
  3. monFichier.cpp:13: error: (Each undeclared identifier is reported only once for each function it appears in.)


 
Avez-vous une idée d'où provient l'erreur ? A noter que si je vire les attributs templates, le code compile.
 

Code :
  1. //template <typename T>
  2. class Parent
  3. {
  4. protected:
  5. int _property;
  6. };
  7. //template <typename T>
  8. class Child : public Parent //<T>
  9. {
  10. void test () {_property;}
  11. };


 
Merci.


---------------
Paléoanthropologie, évolution de l'espèce humaine et préhistoire
Reply

Marsh Posté le 18-02-2008 à 14:29:40   

Reply

Marsh Posté le 18-02-2008 à 14:32:29    

c'est pas juste  
 
template <typename T>  
class Child : public Parent
{
...
}
 
 
:??:


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2008 à 14:35:32    

Non, voici le résultat :/
 

Code :
  1. template <typename T>
  2. class Parent
  3. {
  4. protected:
  5. int _property;
  6. };
  7. template <typename T>
  8. class Child : public Parent //<T>
  9. {
  10. void test () {_property;}
  11. };


 

Code :
  1. monFichier.cpp:12: error: expected class-name before '{' token
  2. monFichier.cpp: In member function `void Child<T>::test()':
  3. monFichier.cpp:13: error: `_property' undeclared (first use this function)
  4. monFichier.cpp:13: error: (Each undeclared identifier is reported only once for each function it appears in.)


---------------
Paléoanthropologie, évolution de l'espèce humaine et préhistoire
Reply

Marsh Posté le 18-02-2008 à 14:37:30    

...et this->_property, ça marche?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2008 à 14:41:14    

Ouais ça marche [:dawa]
 
Merci pour ton aide.
 
Ptain mais c'est quoi, c'est un bug de gcc ?


---------------
Paléoanthropologie, évolution de l'espèce humaine et préhistoire
Reply

Marsh Posté le 18-02-2008 à 14:42:25    

ya p-e une raison quelque part, mais je l'ignore - je te laisse chercher.[:petrus75]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2008 à 14:46:04    

Reply

Marsh Posté le 18-02-2008 à 19:44:54    

Non c'est normal. Ici la _property n'appartient à un contexte dépendant. Donc le compilateur regarde dans Child, puis dans ::. Pour que ça soit valide, tu doit spécifier le contexte avec this pour remettre à plus tard (à l'instantiation du template) la recherche de _property.

Reply

Marsh Posté le 18-02-2008 à 20:04:50    

Pourquoi le compilateur ne regarde-t-il pas dans Parent? J'imagine qu'il y a une bonne raison mais ca me parait pas evident...

Reply

Marsh Posté le 18-02-2008 à 20:08:05    

bah il a aucune raison de privilégier l'un ou l'autre

Reply

Marsh Posté le 18-02-2008 à 20:08:05   

Reply

Marsh Posté le 20-02-2008 à 18:37:41    

Ace17 a écrit :

Pourquoi le compilateur ne regarde-t-il pas dans Parent? J'imagine qu'il y a une bonne raison mais ca me parait pas evident...


Parce que tant que ton template n'est pas instancié, il n'y nulle part où regarder (on peut imaginer différentes spécialisations de Parent, certains n'ayant pas de membre _property). En explicitant this->, tu forces la résolution l'instanciation.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed