Y a t'il une solution simple et élégante pour n'avoir pas à à
redéfinir explicitement
"typedef typename A<B>::I I"
dans AA<B> ?
Y a t'il une solution simple et élégante pour n'avoir pas à à
redéfinir explicitement
"typedef typename A<B>::I I"
dans AA<B> ?
Y a t'il une solution simple et élégante pour n'avoir pas à à
redéfinir explicitement
"typedef typename A<B>::I I"
dans AA<B> ?
Bonjour, je suis en train d'essayer de comprendre comment
fonctionne l'héritage des typedefs et autres types définis
dans une classe parente, en particulier dans le cas des
templates :
Prenons le cas simple suivant :
template<class B>
struct A {
typedef int I;
I i;
A(I ii):i(ii){}
A(){}
};
template<class B>
struct AA: public A<B> {
AA(I ii){i=ii;}
};
int main () {
AA<float> a(2);
std::cout<<a.i;
return(0);
}
Si je supprimes les deux lignes "template<class B>", tout
fonctionne, le "type" I défini dans A est hérité dans AA. Si
je laisse les templates, là ça coince...
16: error: expected `)' before 'ii'
In function 'int main()':
20: error: no matching function for call to 'AA<float>::AA(int)'
15: note: candidates are: AA<float>::AA()
15: note: AA<float>::AA(const AA<float>&)
Je ne comprends pas grand chose à ces messages d'erreur,
mais je pense comprendre que dans la mesure où B n'est pas
instancié, A<B> ne l'est pas non plus, et de fait A<B>::I non
plus...
Y a t'il une solution simple et élégante pour n'avoir pas à à
redéfinir explicitement
"typedef typename A<B>::I I"
dans AA<B> ?
Bonjour, je suis en train d'essayer de comprendre comment
fonctionne l'héritage des typedefs et autres types définis
dans une classe parente, en particulier dans le cas des
templates :
Prenons le cas simple suivant :
template<class B>
struct A {
typedef int I;
I i;
A(I ii):i(ii){}
A(){}
};
template<class B>
struct AA: public A<B> {
AA(I ii){i=ii;}
};
int main () {
AA<float> a(2);
std::cout<<a.i;
return(0);
}
Si je supprimes les deux lignes "template<class B>", tout
fonctionne, le "type" I défini dans A est hérité dans AA. Si
je laisse les templates, là ça coince...
16: error: expected `)' before 'ii'
In function 'int main()':
20: error: no matching function for call to 'AA<float>::AA(int)'
15: note: candidates are: AA<float>::AA()
15: note: AA<float>::AA(const AA<float>&)
Je ne comprends pas grand chose à ces messages d'erreur,
mais je pense comprendre que dans la mesure où B n'est pas
instancié, A<B> ne l'est pas non plus, et de fait A<B>::I non
plus...
Y a t'il une solution simple et élégante pour n'avoir pas à à
redéfinir explicitement
"typedef typename A<B>::I I"
dans AA<B> ?
Bonjour, je suis en train d'essayer de comprendre comment
fonctionne l'héritage des typedefs et autres types définis
dans une classe parente, en particulier dans le cas des
templates :
Prenons le cas simple suivant :
template<class B>
struct A {
typedef int I;
I i;
A(I ii):i(ii){}
A(){}
};
template<class B>
struct AA: public A<B> {
AA(I ii){i=ii;}
};
int main () {
AA<float> a(2);
std::cout<<a.i;
return(0);
}
Si je supprimes les deux lignes "template<class B>", tout
fonctionne, le "type" I défini dans A est hérité dans AA. Si
je laisse les templates, là ça coince...
16: error: expected `)' before 'ii'
In function 'int main()':
20: error: no matching function for call to 'AA<float>::AA(int)'
15: note: candidates are: AA<float>::AA()
15: note: AA<float>::AA(const AA<float>&)
Je ne comprends pas grand chose à ces messages d'erreur,
mais je pense comprendre que dans la mesure où B n'est pas
instancié, A<B> ne l'est pas non plus, et de fait A<B>::I non
plus...
Y a t'il une solution simple et élégante pour n'avoir pas à à
redéfinir explicitement
"typedef typename A<B>::I I"
dans AA<B> ?
Je ne comprends pas exactement ce que tu entends par
"dépendant". Peux tu expliciter s'il te plait ? Dépependant de
quoi ? Du(des) parametre(s) template ?
"comment rendre un symbole *dépendant*, si c'est ça qu'on
veut."
"il n'a pas accès à la classe de base, parce qu'elle
est *dépendante*."
Sinon, dans un premier temps je me suis dit qu'il suffirait
peut etre de declarer l'existence de I dans AA<B> par un
simple "typename I;"
qui serait complété par dérivation à
l'instanciation de B (ce que tu appelles définition ?). Mais
je me suis fait insulter par le compilo : expected
nested-name-specifier before 'I'
gcc connait toujours plus de gros mots que moi... ça veut dire
quoi, ça, en l'occurrence ?
Après quoi je me suis dit que bon, j'étais un brin obligé de
redéfinir explicitement I dans AA<B>, par un moche "typedef
typename A<B>::I I;"
qui m'a amené à comprendre que "i" aussi subissait
l'ostracisme du compilo...
Bref, me voilà à écrire des chose aussi laides que "A<B>::i"
dans AA<B>... Après tout pourquoi pas !
Autre remarque : j'ai bien l'impression que tout ça dépend du
compilo lui meme, voire de la version dudit compilo...
En fait j'ai eu un déboire avec ma debian la semaine dernière
et un certain nombre de trucs ont été remplacés dans mon dos
(je suspecte le package g++ d'en avoir fait les frais).
Depuis, un certain nombre de mes classes templates reffusent
la compilation.
En particulier je me suis rendu compte aujourd'hui que:
template <class T>
class Tri : public Triplet<T,T,T>
{
[..]
T& operator[](int i){
assert((i>=0) && (i<3));
switch (i) {
case 0:return first;
case 1:return second;
case 2:return third;
}
}
[..]
};
ne tombe en marche que si je remplace par exemple "first" par
"Triplet<T,T,T>::first" !
Je ne comprends pas exactement ce que tu entends par
"dépendant". Peux tu expliciter s'il te plait ? Dépependant de
quoi ? Du(des) parametre(s) template ?
"comment rendre un symbole *dépendant*, si c'est ça qu'on
veut."
"il n'a pas accès à la classe de base, parce qu'elle
est *dépendante*."
Sinon, dans un premier temps je me suis dit qu'il suffirait
peut etre de declarer l'existence de I dans AA<B> par un
simple "typename I;"
qui serait complété par dérivation à
l'instanciation de B (ce que tu appelles définition ?). Mais
je me suis fait insulter par le compilo : expected
nested-name-specifier before 'I'
gcc connait toujours plus de gros mots que moi... ça veut dire
quoi, ça, en l'occurrence ?
Après quoi je me suis dit que bon, j'étais un brin obligé de
redéfinir explicitement I dans AA<B>, par un moche "typedef
typename A<B>::I I;"
qui m'a amené à comprendre que "i" aussi subissait
l'ostracisme du compilo...
Bref, me voilà à écrire des chose aussi laides que "A<B>::i"
dans AA<B>... Après tout pourquoi pas !
Autre remarque : j'ai bien l'impression que tout ça dépend du
compilo lui meme, voire de la version dudit compilo...
En fait j'ai eu un déboire avec ma debian la semaine dernière
et un certain nombre de trucs ont été remplacés dans mon dos
(je suspecte le package g++ d'en avoir fait les frais).
Depuis, un certain nombre de mes classes templates reffusent
la compilation.
En particulier je me suis rendu compte aujourd'hui que:
template <class T>
class Tri : public Triplet<T,T,T>
{
[..]
T& operator[](int i){
assert((i>=0) && (i<3));
switch (i) {
case 0:return first;
case 1:return second;
case 2:return third;
}
}
[..]
};
ne tombe en marche que si je remplace par exemple "first" par
"Triplet<T,T,T>::first" !
Je ne comprends pas exactement ce que tu entends par
"dépendant". Peux tu expliciter s'il te plait ? Dépependant de
quoi ? Du(des) parametre(s) template ?
"comment rendre un symbole *dépendant*, si c'est ça qu'on
veut."
"il n'a pas accès à la classe de base, parce qu'elle
est *dépendante*."
Sinon, dans un premier temps je me suis dit qu'il suffirait
peut etre de declarer l'existence de I dans AA<B> par un
simple "typename I;"
qui serait complété par dérivation à
l'instanciation de B (ce que tu appelles définition ?). Mais
je me suis fait insulter par le compilo : expected
nested-name-specifier before 'I'
gcc connait toujours plus de gros mots que moi... ça veut dire
quoi, ça, en l'occurrence ?
Après quoi je me suis dit que bon, j'étais un brin obligé de
redéfinir explicitement I dans AA<B>, par un moche "typedef
typename A<B>::I I;"
qui m'a amené à comprendre que "i" aussi subissait
l'ostracisme du compilo...
Bref, me voilà à écrire des chose aussi laides que "A<B>::i"
dans AA<B>... Après tout pourquoi pas !
Autre remarque : j'ai bien l'impression que tout ça dépend du
compilo lui meme, voire de la version dudit compilo...
En fait j'ai eu un déboire avec ma debian la semaine dernière
et un certain nombre de trucs ont été remplacés dans mon dos
(je suspecte le package g++ d'en avoir fait les frais).
Depuis, un certain nombre de mes classes templates reffusent
la compilation.
En particulier je me suis rendu compte aujourd'hui que:
template <class T>
class Tri : public Triplet<T,T,T>
{
[..]
T& operator[](int i){
assert((i>=0) && (i<3));
switch (i) {
case 0:return first;
case 1:return second;
case 2:return third;
}
}
[..]
};
ne tombe en marche que si je remplace par exemple "first" par
"Triplet<T,T,T>::first" !