OVH Cloud OVH Cloud

Petit problème de compréhension

3 réponses
Avatar
smu
Bonjour,

J'ai un petit problème de compilation avec g++ 3.4.2.
Ce bout de code a été développé avec g++ 3.2.3 à l'origine.

Voilà le fichier d'entête :

#include <string>
#include <iostream>

using namespace std;

template<class Type>
class Param
{
public:
Param(string name) : _name(name) {};
string GetName(void) { return _name; }
private:
string _name;
};

template<class Type>
class ParamExclude : public Param <Type>
{
public:
ParamExclude(string name) : Param <Type>(name)
{
cout << GetName() << endl;
};
};

Voici le fichier source :

#include "test.h"
#include <stdlib.h>
#include <iostream>

int main(int argc, char * argv[])
{
ParamExclude<int> myTemplate("Nom");

cout << myTemplate.GetName() << endl;
return EXIT_SUCCESS;
}

Voici la ligne de commande pour la compilation ainsi que l'erreur revoyée :

g++ -fpermissive -o test test.c
In file included from test.c:1:
test.h: In constructor `ParamExclude<Type>::ParamExclude(std::string)':
test.h:22: warning: there are no arguments to `GetName' that depend on a
template parameter, so a declaration of `GetName' must be available

Comment modifie le construteur afin de corriger mon problème ?

D'avance merci

smu

3 réponses

Avatar
Jean-Marc Bourguet
smu writes:

Bonjour,

J'ai un petit problème de compilation avec g++ 3.4.2.
Ce bout de code a été développé avec g++ 3.2.3 à l'origine.


Eh oui, 3.4 est beaucoup plus strict.

Voilà le fichier d'entête :

#include <string>
#include <iostream>

using namespace std;


Cet utilisation de using namespace dans un en-tete n'est vraiment pas
conseillee: on l'impose a tous ceux qui utilisent l'en-tete et ils
n'en veulent peut-etre pas.

template<class Type>
class Param
{
public:
Param(string name) : _name(name) {};
string GetName(void) { return _name; }
private:
string _name;
};

template<class Type>
class ParamExclude : public Param <Type>
{
public:
ParamExclude(string name) : Param <Type>(name)
{
cout << GetName() << endl;


cout << this->GetName() << end;

J'ai pas le temps d'expliquer pourquoi. Rechercher sur "two phase
name lookup" devrait fournir des liens. Je me demande si la doc de
g++ 3.4 n'a pas une explication dans les release notes ou dans la FAQ
d'ailleurs.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Ahmed MOHAMED ALI
Bonjour,
template<class Type>
class Param


Je ne vois pas où tu te sert du paramètre Type dans ton code.
cout << GetName() << endl;
Un nom indépendant du paramètre du template n'est jamais recherché dans une


classe de base dépendante.Il faut donc faire un appel explicit du type
this.GetName() ou
faire using Param<T>::GetName ou faire l'appel
Param<T>::GetName() (Pour ce appel attention quand même si GetName() est
virtuelle)

Ahmed

"smu" wrote in message
news:d2dlk5$l2t$
Bonjour,

J'ai un petit problème de compilation avec g++ 3.4.2.
Ce bout de code a été développé avec g++ 3.2.3 à l'origine.

Voilà le fichier d'entête :

#include <string>
#include <iostream>

using namespace std;

template<class Type>
class Param
{
public:
Param(string name) : _name(name) {};
string GetName(void) { return _name; }
private:
string _name;
};

template<class Type>
class ParamExclude : public Param <Type>
{
public:
ParamExclude(string name) : Param <Type>(name)
{
cout << GetName() << endl;
};
};

Voici le fichier source :

#include "test.h"
#include <stdlib.h>
#include <iostream>

int main(int argc, char * argv[])
{
ParamExclude<int> myTemplate("Nom");

cout << myTemplate.GetName() << endl;
return EXIT_SUCCESS;
}

Voici la ligne de commande pour la compilation ainsi que l'erreur revoyée
:


g++ -fpermissive -o test test.c
In file included from test.c:1:
test.h: In constructor `ParamExclude<Type>::ParamExclude(std::string)':
test.h:22: warning: there are no arguments to `GetName' that depend on a
template parameter, so a declaration of `GetName' must be available

Comment modifie le construteur afin de corriger mon problème ?

D'avance merci

smu



Avatar
smu
Bonjour,
Bonjour,

template<class Type>
class Param



Je ne vois pas où tu te sert du paramètre Type dans ton code.



C'est une version allégée au strict minimum de mon code . Il me
permettait de mettre en évidence mon problème.

cout << GetName() << endl;



Un nom indépendant du paramètre du template n'est jamais recherché dans une
classe de base dépendante.Il faut donc faire un appel explicit du type
this.GetName() ou
faire using Param<T>::GetName ou faire l'appel
Param<T>::GetName() (Pour ce appel attention quand même si GetName() est
virtuelle)

Ahmed



Ok, avec vos deux réponses, je pense avoir saisi le détail.

smu