OVH Cloud OVH Cloud

Nom non dependant et supplantage...

6 réponses
Avatar
Jean-Marc Bourguet
J'ai pas la norme sous la main.
Soit le cas

template <typename T>
struct C: T {
void f() { g(); }
};

g n'etant pas un nom dependant, il n'est pas cherche dans les membres
de T.

Soit

template <typename T>
struct C: T {
void g() {...}
};

Est-ce que g est un nom dependant? Si oui (ce que je pense, mais les
seuls compilateurs que j'ai sous la main n'implemente pas la regle
ci-dessus donc il m'est impossible de tester et j'ai pas non plus la
norme sous la main), il permet donc de supplanter des membres de T.
Est-ce qu'il y a moyen de le rendre indepedant? Si non, est-ce qu'il
y a moyen de le rendre dependant pour supplanter des membres de T.

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

6 réponses

Avatar
xavier
Jean-Marc Bourguet a dis le 10/01/2005 15:44:
J'ai pas la norme sous la main.


Moi non plus, mais je pense que l'exemple ci-dessous devrait apporter un
début de réponse :

// test_subtmpl.cpp
class Foo {
public:
void bar(int i) {}
};

template <typename T>
class SubT : public T {
public:
#if TEST
using T::bar;
#endif
void bar() {}

void test() {
int i;
bar(i);
}
};

int main() {
SubT<Foo> foo;
foo.test();
}
//eof

$ g++ -o mtest test_subtmpl.cpp
test_subtmpl.cpp: In member function `void SubT<T>::test() [with T = Foo]':
test_subtmpl.cpp:23: instantiated from here
test_subtmpl.cpp:17: error: no matching function for call to
`SubT<Foo>::bar(int&)'
test_subtmpl.cpp:13: note: candidates are: void SubT<T>::bar() [with T =
Foo]
$ g++ -DTEST=1 -o mtest test_subtmpl.cpp && echo compilation succeeded
compilation succeeded

xavier

Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| J'ai pas la norme sous la main.
| Soit le cas
|
| template <typename T>
| struct C: T {
| void f() { g(); }
| };
|
| g n'etant pas un nom dependant, il n'est pas cherche dans les membres
| de T.
|

OK.

| Soit
|
| template <typename T>
| struct C: T {
| void g() {...}
| };
|
| Est-ce que g est un nom dependant?

g est en train d'être déclaré ; qu'es-ce que cela voudrait dire d'être
dépendant dans ce cas ?

| Si oui (ce que je pense, mais les
| seuls compilateurs que j'ai sous la main n'implemente pas la regle
| ci-dessus donc il m'est impossible de tester et j'ai pas non plus la
| norme sous la main), il permet donc de supplanter des membres de T.

Oui.

| Est-ce qu'il y a moyen de le rendre indepedant? Si non, est-ce qu'il
| y a moyen de le rendre dependant pour supplanter des membres de T.

Je ne comprends pas ce que tu veux dire pas nom dépendant, lorsque
celui-ci est en train d'être déclaré.

-- Gaby
Avatar
Gabriel Dos Reis
xavier writes:

| Jean-Marc Bourguet a dis le 10/01/2005 15:44:
| > J'ai pas la norme sous la main.
|
| Moi non plus, mais je pense que l'exemple ci-dessous devrait apporter
| un début de réponse :

Je ne vois paas le rapport.
Tu parles de « nom masqué » (« hidden name ») alors que Jean-Marc par
de functions supplantées de de nom dépendant.

| // test_subtmpl.cpp
| class Foo {
| public:
| void bar(int i) {}
| };
|
| template <typename T>
| class SubT : public T {
| public:
| #if TEST
| using T::bar;
| #endif
| void bar() {}
|
| void test() {
| int i;
| bar(i);
| }
| };
|
| int main() {
| SubT<Foo> foo;
| foo.test();
| }
| //eof
|
| $ g++ -o mtest test_subtmpl.cpp
| test_subtmpl.cpp: In member function `void SubT<T>::test() [with T = Foo]':
| test_subtmpl.cpp:23: instantiated from here
| test_subtmpl.cpp:17: error: no matching function for call to
| `SubT<Foo>::bar(int&)'
| test_subtmpl.cpp:13: note: candidates are: void SubT<T>::bar() [with T
| = Foo]
| $ g++ -DTEST=1 -o mtest test_subtmpl.cpp && echo compilation succeeded
| compilation succeeded

Tu n'as pas besoin de template pour avoir cette erreur.

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

| Si oui (ce que je pense, mais les
| seuls compilateurs que j'ai sous la main n'implemente pas la regle
| ci-dessus donc il m'est impossible de tester et j'ai pas non plus la
| norme sous la main), il permet donc de supplanter des membres de T.

Oui.

| Est-ce qu'il y a moyen de le rendre indepedant? Si non, est-ce qu'il
| y a moyen de le rendre dependant pour supplanter des membres de T.

Je ne comprends pas ce que tu veux dire pas nom dépendant, lorsque
celui-ci est en train d'être déclaré.


Je m'exprime mal, je voudrais un moyen pour que g ne supplante pas une
virtuelle de meme nom dans T. (Mettons que g soit prive des deux
cotes).

J'ai pas le temps d'etre plus long, je dois partir maintenant.

--
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
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > | Si oui (ce que je pense, mais les
| > | seuls compilateurs que j'ai sous la main n'implemente pas la regle
| > | ci-dessus donc il m'est impossible de tester et j'ai pas non plus la
| > | norme sous la main), il permet donc de supplanter des membres de T.
| >
| > Oui.
| >
| > | Est-ce qu'il y a moyen de le rendre indepedant? Si non, est-ce qu'il
| > | y a moyen de le rendre dependant pour supplanter des membres de T.
| >
| > Je ne comprends pas ce que tu veux dire pas nom dépendant, lorsque
| > celui-ci est en train d'être déclaré.
|
| Je m'exprime mal, je voudrais un moyen pour que g ne supplante pas une
| virtuelle de meme nom dans T. (Mettons que g soit prive des deux
| cotes).

Je crois que c'est impossible -- tout comme dans le cas normal sans
template. La seule exception c'est si g() est elle-même template.

Tu peux, si tes contraintes le permettent, définir g() dans une autre
classe de base et en hériter.

-- Gaby
Avatar
James Kanze
Jean-Marc Bourguet wrote:
J'ai pas la norme sous la main.
Soit le cas


template <typename T>
struct C: T {
void f() { g(); }
};


g n'etant pas un nom dependant, il n'est pas cherche dans les
membres de T.


Soit


template <typename T>
struct C: T {
void g() {...}
};


Est-ce que g est un nom dependant?


Non.

Si oui (ce que je pense, mais les seuls compilateurs que j'ai
sous la main n'implemente pas la regle ci-dessus donc il m'est
impossible de tester et j'ai pas non plus la norme sous la
main), il permet donc de supplanter des membres de T. Est-ce
qu'il y a moyen de le rendre indepedant? Si non, est-ce qu'il
y a moyen de le rendre dependant pour supplanter des membres
de T.


Premier paragraphe de §14.6 : « Three kinds of names can be used
within a template definition. » On a tendence à ne parler que
des noms dépendants et noms non-dépendants, et on oublie la
troisième catégorie : les « locally declared names ».
(Probablement parce que ce sont les seuls qui ne posent pas de
problème:-).)

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34