Le code suivant n'est plus compilé par des compilateurs récents tels
que gcc 3.4 :
template <typename T> struct A {
int x;
};
template <typename T> struct B : public A<T> {
void foo() { x = 1; }
};
L'erreur est:
foo.cc: In member function `void B<T>::foo()':
foo.cc:5: error: `x' undeclared (first use this function)
foo.cc:5: error: (Each undeclared identifier is reported only once for each
function it appears in.)
Les notes de gcc 3.4 parlent bien de ce changement :
In a template definition, unqualified names will
no longer find members of a dependent base.
Toutefois je n'arrive pas à trouver le paragraphe du chapitre 14 de la
norme C++ qui le justifient. C'est probablement caché dans 14.6 mais
j'ai du mal à suivre les paragraphes en question... Quelqu'un peut-il
me montrer le paragraphe qui s'applique à ce cas ?
Qu'est-ce qu'une "base dépendante" ?
Pourquoi faire un cas spécial pour les templates ?
Le code suivant n'est plus compilé par des compilateurs récents tels
que gcc 3.4 :
template <typename T> struct A {
int x;
};
template <typename T> struct B : public A<T> {
void foo() { x = 1; }
};
L'erreur est:
foo.cc: In member function `void B<T>::foo()':
foo.cc:5: error: `x' undeclared (first use this function)
foo.cc:5: error: (Each undeclared identifier is reported only once for each
function it appears in.)
Les notes de gcc 3.4 parlent bien de ce changement :
In a template definition, unqualified names will
no longer find members of a dependent base.
Toutefois je n'arrive pas à trouver le paragraphe du chapitre 14 de la
norme C++ qui le justifient. C'est probablement caché dans 14.6 mais
j'ai du mal à suivre les paragraphes en question... Quelqu'un peut-il
me montrer le paragraphe qui s'applique à ce cas ?
Qu'est-ce qu'une "base dépendante" ?
Pourquoi faire un cas spécial pour les templates ?
Le code suivant n'est plus compilé par des compilateurs récents tels
que gcc 3.4 :
template <typename T> struct A {
int x;
};
template <typename T> struct B : public A<T> {
void foo() { x = 1; }
};
L'erreur est:
foo.cc: In member function `void B<T>::foo()':
foo.cc:5: error: `x' undeclared (first use this function)
foo.cc:5: error: (Each undeclared identifier is reported only once for each
function it appears in.)
Les notes de gcc 3.4 parlent bien de ce changement :
In a template definition, unqualified names will
no longer find members of a dependent base.
Toutefois je n'arrive pas à trouver le paragraphe du chapitre 14 de la
norme C++ qui le justifient. C'est probablement caché dans 14.6 mais
j'ai du mal à suivre les paragraphes en question... Quelqu'un peut-il
me montrer le paragraphe qui s'applique à ce cas ?
Qu'est-ce qu'une "base dépendante" ?
Pourquoi faire un cas spécial pour les templates ?
Pourquoi faire un cas spécial pour les templates ?
Pour créer la confusion ? Pour casser le code existante ? Pour emmerder
les gens en général ? :-)
Quant à la motivation de cette bizarrerie, considérons le suivant:
#include <nath.h>
template< typename B >
class A : public B
{
void f( double d ) { double d = sin( d ) ; }
} ;
Je crois que c'est clair quelle fonction l'auteur voulait quand il a
écrit sin(d). Or, qu'est-ce qui se passe si la classe B comporte une
Pourquoi faire un cas spécial pour les templates ?
Pour créer la confusion ? Pour casser le code existante ? Pour emmerder
les gens en général ? :-)
Quant à la motivation de cette bizarrerie, considérons le suivant:
#include <nath.h>
template< typename B >
class A : public B
{
void f( double d ) { double d = sin( d ) ; }
} ;
Je crois que c'est clair quelle fonction l'auteur voulait quand il a
écrit sin(d). Or, qu'est-ce qui se passe si la classe B comporte une
Pourquoi faire un cas spécial pour les templates ?
Pour créer la confusion ? Pour casser le code existante ? Pour emmerder
les gens en général ? :-)
Quant à la motivation de cette bizarrerie, considérons le suivant:
#include <nath.h>
template< typename B >
class A : public B
{
void f( double d ) { double d = sin( d ) ; }
} ;
Je crois que c'est clair quelle fonction l'auteur voulait quand il a
écrit sin(d). Or, qu'est-ce qui se passe si la classe B comporte une
Dimitri Papadopoulos-Orfanos writes:
| >>Pourquoi faire un cas spécial pour les templates ?
| > Pour créer la confusion ? Pour casser le code existante ? Pour
| > emmerder les gens en général ? :-)
| Effectivement, ce genre de plaisanterie casse des milliers de lignes
| de code. C'est d'un goût douteux :-)
Évidemment, James -- malgré les faits -- essayera de présenter ces
règles comme si elles dataient d'hier.
Dimitri Papadopoulos-Orfanos <dpo.remove@club-internet.decoy.fr> writes:
| >>Pourquoi faire un cas spécial pour les templates ?
| > Pour créer la confusion ? Pour casser le code existante ? Pour
| > emmerder les gens en général ? :-)
| Effectivement, ce genre de plaisanterie casse des milliers de lignes
| de code. C'est d'un goût douteux :-)
Évidemment, James -- malgré les faits -- essayera de présenter ces
règles comme si elles dataient d'hier.
Dimitri Papadopoulos-Orfanos writes:
| >>Pourquoi faire un cas spécial pour les templates ?
| > Pour créer la confusion ? Pour casser le code existante ? Pour
| > emmerder les gens en général ? :-)
| Effectivement, ce genre de plaisanterie casse des milliers de lignes
| de code. C'est d'un goût douteux :-)
Évidemment, James -- malgré les faits -- essayera de présenter ces
règles comme si elles dataient d'hier.
Dimitri Papadopoulos-Orfanos
writes:
| réécrire des centaines de classes. Chose que je ne peux pas faire.
| Je pense que genre de changements met en cause la pertinence du C++
| pour l'écriture de gros projets destinés à vivre plusieurs années.
Ces règles n'ont pas été inventées hier.
Elles datent du temps même de la conception des templates.
Certaines personnes (avec le complice de certains compilateurs)
essayeront de te faire croire que c'est pas vrai.
Google pour des messages de David Vendevoorde et moi même sur ce
sujet.
Dimitri Papadopoulos-Orfanos <dpo.remove@club-internet.decoy.fr>
writes:
| réécrire des centaines de classes. Chose que je ne peux pas faire.
| Je pense que genre de changements met en cause la pertinence du C++
| pour l'écriture de gros projets destinés à vivre plusieurs années.
Ces règles n'ont pas été inventées hier.
Elles datent du temps même de la conception des templates.
Certaines personnes (avec le complice de certains compilateurs)
essayeront de te faire croire que c'est pas vrai.
Google pour des messages de David Vendevoorde et moi même sur ce
sujet.
Dimitri Papadopoulos-Orfanos
writes:
| réécrire des centaines de classes. Chose que je ne peux pas faire.
| Je pense que genre de changements met en cause la pertinence du C++
| pour l'écriture de gros projets destinés à vivre plusieurs années.
Ces règles n'ont pas été inventées hier.
Elles datent du temps même de la conception des templates.
Certaines personnes (avec le complice de certains compilateurs)
essayeront de te faire croire que c'est pas vrai.
Google pour des messages de David Vendevoorde et moi même sur ce
sujet.
N'empêche que l'idée de
base me semble bien -- seulement, je n'aime pas que ce soit le
compilateur (et non moi) qui choisit quels noms sont dépendants, et
quels noms ne le sont pas, d'une façon assez subtile et non toujours
très transparente.
N'empêche que l'idée de
base me semble bien -- seulement, je n'aime pas que ce soit le
compilateur (et non moi) qui choisit quels noms sont dépendants, et
quels noms ne le sont pas, d'une façon assez subtile et non toujours
très transparente.
N'empêche que l'idée de
base me semble bien -- seulement, je n'aime pas que ce soit le
compilateur (et non moi) qui choisit quels noms sont dépendants, et
quels noms ne le sont pas, d'une façon assez subtile et non toujours
très transparente.