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

C ++ 11

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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow