OVH Cloud OVH Cloud

noms dependants

4 réponses
Avatar
Arnaud Meurgues
Bonjour à tous,

Je ne suis pas super à l'aise avec ces histoires de noms dépendant et
l'usage de typename. J'ai un problème avec gcc et je me demande si le
problème vient de moi ou de gcc.

Soit le programme suivant :

template <class X>
class A {
public:
typedef int entier;
};

template <class X>
class B : public A<X> {
public:
void f(entier i);
};

int main(int argc, char* argv[]) {
return 0;
}

gcc 3.2.3 me donne :

[meurgues@precision79]/tmp >gcc32 gcc.cpp
gcc.cpp:11: warning: `typename B<X>::entier' is implicitly a typename
gcc.cpp:11: warning: implicit typename is deprecated, please see the
documentation for details
[meurgues@precision79]/tmp >

Mais ça compile.

gcc 3.4.4 me donne :

[meurgues@precision79]/tmp >gcc gcc.cpp
gcc.cpp:11: error: `entier' has not been declared
gcc.cpp:11: error: ISO C++ forbids declaration of `i' with no type
[meurgues@precision79]/tmp >

Je suppose donc que le problème est que entier n'est pas dans le scope
de B<X> et qu'il faut donc utiliser une clause using :

template <class X>
class B : public A<X> {
public:
using A<X>::entier;
void f(entier i);
};

Là, gcc 3.4.4 me donne :

[meurgues@precision79]/tmp >gcc gcc.cpp
gcc.cpp:12: error: `entier' is not a type
gcc.cpp:12: error: ISO C++ forbids declaration of `i' with no type
[meurgues@precision79]/tmp >

Je suppose qu'il ne sait pas que entier est un type et que c'est là
qu'il faut utiliser typename pour le stipuler. Je rajoute donc le
typename ainsi :

template <class X>
class B : public A<X> {
public:
using typename A<X>::entier;
void f(entier i);
};

Mais là, gcc 3.4.4 me dit toujours :

[meurgues@precision79]/tmp >gcc gcc.cpp
gcc.cpp:12: error: `entier' is not a type
gcc.cpp:12: error: ISO C++ forbids declaration of `i' with no type
[meurgues@precision79]/tmp >

et je ne comprends plus. J'ai sûrement raté quelque chose.

--
Arnaud

4 réponses

Avatar
Jean-Marc Bourguet
Arnaud Meurgues writes:

Je ne suis pas super à l'aise avec ces histoires de noms dépendant
et l'usage de typename.


Qui est super a l'aise avec la recherche de nom? Pas moi en tout cas.

template <class X>
class A {
public:
typedef int entier;
};

template <class X>
class B : public A<X> {
public:
using typename A<X>::entier;
void f(entier i);
};

Mais là, gcc 3.4.4 me dit toujours :

[]/tmp >gcc gcc.cpp
gcc.cpp:12: error: `entier' is not a type
gcc.cpp:12: error: ISO C++ forbids declaration of `i' with no type
[]/tmp >

et je ne comprends plus. J'ai sûrement raté quelque chose.


Je ne comprends pas non plus, j'aurais dit que c'etait bon. como
online pense comme nous. Un petit bug report a g++ pour voir ce
qu'ils disent? (A moins que Gaby intervienne avant; si j'ai le temps
ce soir, j'essaierai de trouver des references dans un sens ou
l'autre).

Work around evident:

typedef typename A<X>::entier entier;

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
Arnaud Meurgues
Jean-Marc Bourguet wrote:

Je ne comprends pas non plus, j'aurais dit que c'etait bon.


Ça me rassure.

Work around evident:

typedef typename A<X>::entier entier;


Tellement évident que je n'y avais pas pensé. Merci.

--
Arnaud

Avatar
Jean-Marc Bourguet
Jean-Marc Bourguet writes:

Je ne comprends pas non plus, j'aurais dit que c'etait bon. como
online pense comme nous. Un petit bug report a g++ pour voir ce
qu'ils disent? (A moins que Gaby intervienne avant; si j'ai le temps
ce soir, j'essaierai de trouver des references dans un sens ou
l'autre).


Je ne vois rien en C++ 98 ni en C++ 2003, mais N1905 a

7.3.3/20

If a using-declaration uses the keyword typename and
specifies a dependent name (14.6.2), the name introduced
by the using-declaration is treated as a typedef-name
(7.1.3).

Je n'ai pas cherché plus loin, je suppose que l'ajout est
une clarification car j'ai dû mal à imaginer un raisonnement
permettant

using typename PP::XXXX;

(qui est dans 7.3.3/1 de C++98) sans que XXXX soit considéré
comme un type.

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
Arnaud Meurgues
Jean-Marc Bourguet wrote:

j'ai dû mal à imaginer un raisonnement permettant

using typename PP::XXXX;

(qui est dans 7.3.3/1 de C++98) sans que XXXX soit considéré comme un
type.


Oui. Ce serait plus qu'étrange. Merci, en tout cas.

--
Arnaud