Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[namespace] Qd utiliser le "qualificateur global ::" (e.g. boost::noncopyable ou ::boost::noncopyable)

6 réponses
Avatar
bylybob
Salut a tous, j'ai jamais vraiment compris qd je devais prefixer les
noms de classes par ::

Dois-je faire: class lala : private boost::noncopyable {}; ou class
lala : private ::boost::noncopyable {};

J'imagine que cela depend du namespace ou on se situe. Une ame
charitable pourrait-elle me clarifier l'usage?

Merci,

bylybob

6 réponses

Avatar
Fabien LE LEZ
On 2 Apr 2007 15:03:19 -0700, "bylybob" :

Salut a tous, j'ai jamais vraiment compris qd je devais prefixer les
noms de classes par ::


Quand il y a une ambiguïté.

class lala : private ::boost::noncopyable {};


Ce n'est utile que s'il y a plusieurs "boost", dans plusieurs
namespaces différents.

Si tu écris :

namespace MonEspace
{
class boost;

class lala: ...
}

il y a une ambiguïté entre ::boost (le "boost" du namespace global) et
MonEspace::boost. Si tu écris "boost" quelque part (dans ton
"private boost::..." par exemple), sans précision, le compilateur va
croire que tu parles du "boost" local, i.e. MonEspace::boost.

En l'occurence, "boost" est un nom très connu, et il y a peu de
chances pour que tu aies l'idée saugrenue d'appeler une de tes classes
ou un de tes namespaces de cette manière ; aussi, la précision (le
"::" au début) est rarement utile.

Avatar
bylybob
On Apr 2, 3:10 pm, Fabien LE LEZ wrote:
On 2 Apr 2007 15:03:19 -0700, "bylybob" :

Salut a tous, j'ai jamais vraiment compris qd je devais prefixer les
noms de classes par ::


Quand il y a une ambiguïté.

class lala : private ::boost::noncopyable {};


Ce n'est utile que s'il y a plusieurs "boost", dans plusieurs
namespaces différents.

Si tu écris :

namespace MonEspace
{
class boost;

class lala: ...

}

il y a une ambiguïté entre ::boost (le "boost" du namespace global) et
MonEspace::boost. Si tu écris "boost" quelque part (dans ton
"private boost::..." par exemple), sans précision, le compilateur va
croire que tu parles du "boost" local, i.e. MonEspace::boost.

En l'occurence, "boost" est un nom très connu, et il y a peu de
chances pour que tu aies l'idée saugrenue d'appeler une de tes classes
ou un de tes namespaces de cette manière ; aussi, la précision (le
"::" au début) est rarement utile.


OK, tres clair. Merci.

Donc j'en tire la "guideline" generale suivant (1) ne pas specifier le
namespace global en prefixant par :: (2) si ambiguïté il y a (le
compilateur rale), lever l'ambiguïté en prefixant par :: pour le scope
global.


Avatar
Fabien LE LEZ
On 2 Apr 2007 15:33:49 -0700, "bylybob" :

(2) si ambiguïté il y a (le
compilateur rale)


Généralement, le compilateur ne râle pas (ou du moins, n'affiche pas
un message très clair) ; il choisit le namespace le plus local.

Mais en pratique, il est assez rare d'utiliser l'écriture en question.

Avatar
Sylvain
Fabien LE LEZ wrote on 03/04/2007 01:12:

Mais en pratique, il est assez rare d'utiliser l'écriture en question.


question de gout, en pratique, je préfixe toujours les fonctions du CRT
par un "::" pour justement éviter une surcharge d'un nom (de fonction,
pas de namespace) très connu.

Sylvain.

Avatar
James Kanze
On Apr 3, 1:12 am, Fabien LE LEZ wrote:
On 2 Apr 2007 15:33:49 -0700, "bylybob" :

(2) si ambiguïté il y a (le
compilateur rale)


Généralement, le compilateur ne râle pas (ou du moins, n'affiche pas
un message très clair) ; il choisit le namespace le plus local.

Mais en pratique, il est assez rare d'utiliser l'écriture en question.


Sauf, peut-être, si on écrit une bibliothèque à l'utilisation
générale. Où tu ne sais pas quels noms de classe ou de namespace
tu risques de trouver dans tes en-têtes. Mais ce n'est pas
toujours nécessaire non plus : si tu es dans le namespace X, et
qu'il y une class Y dans ce namespace, c'est bien elle que le
compilateur va trouver si tu écris Y tout court.

Autrefois, on l'utiliser les :: assez systèmatiquement dans les
templates, quand on voulait une fonction globale, et non une de
la classe de base. (Aujourd'hui, c'est l'inverse. « f() »
tout court signifie une fonction globale, et il faut écrire
« this->f() » pour dire au compilateur de chercher dans la
classe de base.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
James Kanze
On Apr 3, 1:53 am, Sylvain wrote:
Fabien LE LEZ wrote on 03/04/2007 01:12:

Mais en pratique, il est assez rare d'utiliser l'écriture en question.


question de gout, en pratique, je préfixe toujours les fonctions du CRT
par un "::" pour justement éviter une surcharge d'un nom (de fonction,
pas de namespace) très connu.


Pas seulement de goût. Si tu implémentes quelque chose du genre
std::filebuf::close(), il vaut mieux que tu écris ::close()
dedans pour accéder à l'API du système, plutôt que simplement
close(). Ensuite, par souci d'orthogonalité...

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34