C++
Utiliser la déclaration
Recherche…
Introduction
Une déclaration using
introduit un nom unique dans la portée actuelle précédemment déclarée ailleurs.
Syntaxe
- en utilisant typename ( opt ) nested-name-specifier non-qualifié-id ;
- using :: unqualified-id ;
Remarques
Une déclaration d'utilisation est distincte d'une directive using , qui indique au compilateur de chercher dans un espace de nom particulier lors de la recherche d' un nom. Une directive using namespace
commence par using namespace
.
Une déclaration d'utilisation est également distincte d'une déclaration d'alias, qui donne un nouveau nom à un type existant de la même manière que typedef
. Une déclaration d'alias contient un signe égal.
Importation de noms individuellement à partir d'un espace de noms
Une fois que l’ using
est utilisée pour introduire le nom cout
de l’espace de noms std
dans la portée de la fonction main
, l’objet std::cout
peut être appelé cout
seul.
#include <iostream>
int main() {
using std::cout;
cout << "Hello, world!\n";
}
Redéclarer les membres d’une classe de base pour éviter de les masquer
Si une déclaration using se produit à la portée de la classe, elle est uniquement autorisée à redéclarer un membre d'une classe de base. Par exemple, l' using std::cout
n'est pas autorisée dans la portée de la classe.
Souvent, le nom redéclaré est un nom qui serait autrement caché. Par exemple, dans le code ci-dessous, d1.foo
fait uniquement référence à Derived1::foo(const char*)
et une erreur de compilation se produira. La fonction Base::foo(int)
n'est pas du tout prise en compte. Cependant, d2.foo(42)
convient bien car la déclaration using apporte Base::foo(int)
dans l'ensemble des entités nommées foo
dans Derived2
. La recherche de nom trouve alors foo
s et la résolution de surcharge sélectionne Base::foo
.
struct Base {
void foo(int);
};
struct Derived1 : Base {
void foo(const char*);
};
struct Derived2 : Base {
using Base::foo;
void foo(const char*);
};
int main() {
Derived1 d1;
d1.foo(42); // error
Derived2 d2;
d2.foo(42); // OK
}
Héritage des constructeurs
En tant que cas particulier, une déclaration d'utilisation à la portée d'une classe peut faire référence aux constructeurs d'une classe de base directe. Ces constructeurs sont ensuite hérités par la classe dérivée et peuvent être utilisés pour initialiser la classe dérivée.
struct Base {
Base(int x, const char* s);
};
struct Derived1 : Base {
Derived1(int x, const char* s) : Base(x, s) {}
};
struct Derived2 : Base {
using Base::Base;
};
int main() {
Derived1 d1(42, "Hello, world");
Derived2 d2(42, "Hello, world");
}
Dans le code ci-dessus, Derived1
et Derived2
ont Derived2
deux des constructeurs qui transmettent les arguments directement au constructeur correspondant de Base
. Derived1
effectue le transfert explicitement, alors que Derived2
, utilisant la fonctionnalité C ++ 11 pour hériter des constructeurs, le fait implicitement.