Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

utilisation du nom d'une classe template dans sa déclaration, explication à l'intérieur

3 réponses
Avatar
Helfer Thomas
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

3 réponses

Avatar
Cyrille
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.

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.

Avatar
Helfer Thomas
Le Fri, 11 Aug 2006 23:37:37 +0200, Cyrille 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


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 :)


Avatar
Gabriel Dos Reis
Helfer Thomas writes:

| Le Fri, 11 Aug 2006 23:37:37 +0200, Cyrille 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