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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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 :
[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.
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
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
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
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.
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
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
Jean-Marc Bourguet <jm@bourguet.org> 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
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
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
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.