OVH Cloud OVH Cloud

Souci de using-declaration

5 réponses
Avatar
Gourgouilloult
Bonsoir,

Je viens de tomber sur un souci en tentant une using-declaration des
plus anodines. Le Stroustrup ne laissant pas entendre qu'il puisse y
avoir de problème, je regarde la norme et je trouve :

7.3.3/6 « A using-declaration for a class member shall be a
member-declaration.»

Heureusement, l'exemple donné renseigne sur la signification de "shall" :

struct X {
int i;
static int s;
};

void f () {
using X::i; // error: X::i is a class member
// and this is not a member declaration
using X::s; // error: X::s is a class member
// and this is not a member declaration
}

Alors autant je comprends pour i, autant je ne comprends pas trop pour
une variable membre statique (X::s désignant de manière claire une et
une seule variable...). Ca m'ennuie d'autant plus que c'est justement ce
que j'étais en train d'essayer de faire. ;)

Si quelqu'un a un bout d'explication ?

(Et pour le fait que c'est reporté comme une opaque erreur de syntaxe
par mon gcc-3.qqch... je peux essayer de me faire une raison.)

Gourgou

5 réponses

Avatar
Michel Michaud
Dans news:401ef5c8$0$6976$,
Bonsoir,

Je viens de tomber sur un souci en tentant une using-declaration des
plus anodines. Le Stroustrup ne laissant pas entendre qu'il puisse y
avoir de problème, je regarde la norme et je trouve :

7.3.3/6 « A using-declaration for a class member shall be a
member-declaration.»

Heureusement, l'exemple donné renseigne sur la signification de
"shall" :

struct X {
int i;
static int s;
};

void f () {
using X::i; // error: X::i is a class member
// and this is not a member declaration
using X::s; // error: X::s is a class member
// and this is not a member declaration
}

Alors autant je comprends pour i, autant je ne comprends pas trop
pour une variable membre statique (X::s désignant de manière claire
une et une seule variable...). Ca m'ennuie d'autant plus que c'est
justement ce que j'étais en train d'essayer de faire. ;)


Tu essaies de faire quoi ? Une déclaration using sur un membre
doit être dans la définition de la classe, c'est aussi simple
que ça. Et ça ne fera pas ce que tu veux.

Ce n'est pas un using sur un élément de namespace. Il n'y aucun
moyen de permettre l'écriture « s » pour X::s en dehors de la
classe comme on pourrait le faire avec un namespace. Il te faut
donc écrire X::s ou faire int& s= X::s;

(si c'est le pourquoi de cette règle qui t'intéresse, j'imagine
que c'est seulement qu'on n'a pas pensé que ce serait très
utile.)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Gourgouilloult

(si c'est le pourquoi de cette règle qui t'intéresse,


Exactement. Si je citais la norme, c'était pour montrer que j'avais bien
compris que j'avais pas le droit.

j'imagine
que c'est seulement qu'on n'a pas pensé que ce serait très
utile.)


Pourtant, dans l'exemple, ils ont songé à faire ressortir le cas des
données membres statiques. Ca plutôt gros, comme coincidence, non ?

Si je fais semblant d'avoir une idée, est-ce que je pourrais avoir
raison de penser que ça a rapport aux niveaux d'accés, qu'il n'est pas
prévu de pouvoir vérifier dans une fonction ? Genre éviter les cas comme
ça :

struct X {
static int s_pub;
private:
static int s_priv;
};

void f () {
using X::s_pub; // si ça passait, ça m'arrangerait
using X::s_priv; // ça, j'aimerais moins
}

Gourgou
(Je suis pas certain que ça soit très sensé ; j'essaye juste d'avoir un
début d'idée, j'ai dit, hein...)

Avatar
Gourgouilloult
Gourgouilloult parle tout seul :

Si je fais semblant d'avoir une idée, est-ce que je pourrais avoir
raison de penser que ça a rapport aux niveaux d'accés, qu'il n'est pas
prévu de pouvoir vérifier dans une fonction ?


Râh, genre pour dire des bêtises... faudrait qu'il y ait des tortuations
folles dans la grammaire des using-declarations, pour que ça relève de
ce genre de choses. Je veux dire, ça arrive d'avoir à résoudre des id de
membres dans une fonction :

struct X {
static int s_pub;
private:
static int s_priv;
};

void f () {
using X::s_pub; // si ça passait, ça m'arrangerait
using X::s_priv; // ça, j'aimerais moins
}


void g () {
int i = X::s_pub; // ça marche, et c'est bien
int j = X::s_priv; // ça marche pas, et c'est bien
}

Définitivement, cette dissymétrie m'interpelle... bon, hop, un tour dans
les bouquins !
[...]

(Je suis pas certain que ça soit très sensé ; j'essaye juste d'avoir un
début d'idée, j'ai dit, hein...)


Non, ç'a a vraiment pas l'air d'être ça. J'comprends pas.

Gourgou
Zut-euh !

Avatar
Loïc Joly
Gourgouilloult wrote:

Gourgouilloult parle tout seul :
Mais non, pas tout seul, certains écoutent...



void f () {
using X::s_pub; // si ça passait, ça m'arrangerait
using X::s_priv; // ça, j'aimerais moins
}



void g () {
int i = X::s_pub; // ça marche, et c'est bien
int j = X::s_priv; // ça marche pas, et c'est bien
}

Définitivement, cette dissymétrie m'interpelle... bon, hop, un tour dans
les bouquins !
[...]

(Je suis pas certain que ça soit très sensé ; j'essaye juste d'avoir
un début d'idée, j'ai dit, hein...)



Non, ç'a a vraiment pas l'air d'être ça. J'comprends pas.


Peut-être oublies-tu le but des using declaration pour des données
membre, qui est tout autre que les using declaration pour les noms dans
un namespace :

A usingdeclaration for a class member shall be a memberdeclaration.

Et :

A usingdeclaration used as a memberdeclaration shall refer to a member
of a base class of the class being defined, shall refer to a member of
an anonymous union that is a member of a base class of the class being
defined, or shall refer to an enumerator for an enumeration type that is
a member of a base class of the class being defined.

En gros, le but est uniquement de rendre visible aux utilisateurs d'une
classe un nom d'une classe de base qui serait caché autrement.

--
Loïc


Avatar
Gourgouilloult

Gourgouilloult parle tout seul :


Mais non, pas tout seul, certains écoutent...


Je ne craignais pas le contraire, mais il arrive que ma façon d'écrire
tout ce que je pense (y compris, dans mes brouillons, ce que je pense de
ce que j'écris, ainsi que les vannes à deux balles qui vont avec)
surprenne. ;)

Définitivement, cette dissymétrie m'interpelle...


Peut-être oublies-tu le but des using declaration pour des données
membre, qui est tout autre que les using declaration pour les noms dans
un namespace :
[...]

En gros, le but est uniquement de rendre visible aux utilisateurs d'une
classe un nom d'une classe de base qui serait caché autrement.


En gros, on a using et using comme on a static, static et static... Mais
tu conviendras que dans le cas des données membres statiques, c'est un
poil lourd, quand même ?

Gourgou
Inquiet ;)