 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Helfer Thomas Guest
|
Posted: Sat Aug 12, 2006 1:26 am Post subject: utilisation du nom d'une classe template dans sa déclaration |
|
|
Bonjour,
J'ai posé beaucoup de questions sur ce forum ces derniers temps, merci
pour votre aide.
J'ai récemment voulu écrire un code et me suis heurté à un problème
équivalent au problème suivant.
Le code ci-après, qui ne sert pas à grand chose, ne compile pas :
#include<iostream>
#include<cstdlib>
#include<string>
template<unsigned short N,template<unsigned short> class T>
struct A{
static std::string getName(void){
return T<N>::getName();
}
};
template<unsigned short N>
struct B{
static std::string Name(void)
{
return A<N,B>::getName(); // Ici erreur
}
static std::string getName(void)
{
return "B";
}
};
int main(void)
{
std::cout << B<2u>::Name() << std::endl;
return EXIT_SUCCESS;
}
Le problème vient du fait que dans la déclaration de la classe, B est
compris, au moins par gcc, comme B<N>.
Y a t'il un moyen de rendre ce code valide ?
Cordialement,
Helfer Thomas |
|
| Back to top |
|
 |
Cyrille Guest
|
Posted: Sat Aug 12, 2006 2:37 am Post subject: Re: utilisation du nom d'une class e template dans sa déclar |
|
|
Helfer Thomas a écrit :
| Quote: | Bonjour,
Le problème vient du fait que dans la déclaration de la classe, B est
compris, au moins par gcc, comme B<N>.
|
Oui, à l'intérieur de la classe, le nom B désigne B<N>.
| Quote: | Y a t'il un moyen de rendre ce code valide ?
|
Prendre le nom "à l'extérieur de la classe" en s'aidant de l'opérateur
de résolution de portée.
Ainsi, remplacez B par ::B dans la ligne qui fait désordre:
return A<N,::B>::getName(); // Plus d'erreur
Ça marche avec Visual C++ 2005 et Comeau.
Au passage, en C++, mettre void en paramètre des fonctions pour dire
qu'elles n'ont pas de paramètres, est inutile.
--
C'est ma signature qu'elle est la mieux. Pas la vôtre. |
|
| Back to top |
|
 |
Helfer Thomas Guest
|
Posted: Sat Aug 12, 2006 9:11 am Post subject: Re: Re: utilisation du nom d'une classe template dans sa déc |
|
|
Le Fri, 11 Aug 2006 23:37:37 +0200, Cyrille a écrit :
| Quote: | Helfer Thomas a écrit :
Bonjour,
Le problème vient du fait que dans la déclaration de la classe, B est
compris, au moins par gcc, comme B<N>.
Oui, à l'intérieur de la classe, le nom B désigne B<N>.
Y a t'il un moyen de rendre ce code valide ?
Prendre le nom "à l'extérieur de la classe" en s'aidant de l'opérateur
de résolution de portée.
Ainsi, remplacez B par ::B dans la ligne qui fait désordre:
return A<N,::B>::getName(); // Plus d'erreur
Ça marche avec Visual C++ 2005 et Comeau.
Cela marche aussi avec gcc |
merci
| Quote: |
Au passage, en C++, mettre void en paramètre des fonctions pour dire
qu'elles n'ont pas de paramètres, est inutile.
|
Oui, c'est un choix personnel, je trouve le code plus lisible  |
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Sat Aug 12, 2006 6:30 pm Post subject: Re: utilisation du nom d'une classe template dans sa déclara |
|
|
Helfer Thomas <helferthomas.@free.fr> writes:
| Le Fri, 11 Aug 2006 23:37:37 +0200, Cyrille a écrit :
|
| > Helfer Thomas a écrit :
| >> Bonjour,
| >>
| >> Le problème vient du fait que dans la déclaration de la classe, B est
| >> compris, au moins par gcc, comme B<N>.
| >
| > Oui, à l'intérieur de la classe, le nom B désigne B<N>.
| >
| >> Y a t'il un moyen de rendre ce code valide ?
| >
| > Prendre le nom "à l'extérieur de la classe" en s'aidant de l'opérateur
| > de résolution de portée.
| >
| > Ainsi, remplacez B par ::B dans la ligne qui fait désordre:
| > return A<N,::B>::getName(); // Plus d'erreur
| >
| > Ça marche avec Visual C++ 2005 et Comeau.
| Cela marche aussi avec gcc
Oui, c'est la manière standard de faire.
| > Au passage, en C++, mettre void en paramètre des fonctions pour dire
| > qu'elles n'ont pas de paramètres, est inutile.
|
| Oui, c'est un choix personnel, je trouve le code plus lisible :)
C'est une abomination, selon Doug MycIlroy et Dennis Ritchie.
:-)
-- Gaby |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|