サーチ…


前書き

using宣言は、以前に他の場所で宣言されていた現在のスコープに単一の名前を導入します。

構文

  • typename( optネストされた名前指定子 unqualified-idを使用します。
  • :: unqualified-idを使用します。

備考

using宣言は区別されるusingディレクティブ 任意の名前を検索するときに、特定の名前空間に見えるようにコンパイラに指示します。 usingディレクティブは、 using namespaceusing namespaceことから始まりusing namespace

use -declarationは、 typedefと同じ方法で既存の型に新しい名前を与える別名宣言とは異なりtypedef 。エイリアス宣言には等号が含まれます。

名前空間から個別に名前をインポートする

一度using名前導入するために使用されcout名前空間からstd範囲内にmain機能、 std::coutオブジェクトを呼ぶことができるcoutのみ。

#include <iostream>
int main() {
    using std::cout;
    cout << "Hello, world!\n";
}

名前の隠蔽を避けるために、基本クラスのメンバーを再宣言します。

use -declarationがクラスscopeで発生した場合は、基本クラスのメンバーのみを再宣言できます。たとえば、 using std::coutはクラススコープでは許可されません。

多くの場合、再宣言された名前は、さもなければ隠される名前です。たとえば、以下のコードでは、 d1.fooDerived1::foo(const char*)のみを参照し、コンパイルエラーが発生します。 Base::foo(int)は隠蔽されていません。しかし、 d2.foo(42) 宣言Derived2 fooという名前のエンティティの集合にBase::foo(int)をもたらすため、 d2.foo(42)は問題ありDerived2 。 Name lookupはfooとoverloadの両方の解決法を見つけ、 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
}

継承コンストラクタ

C ++ 11

特別な場合として、クラススコープでのusing宣言は、直接基底クラスのコンストラクタを参照できます。これらのコンストラクタは、派生クラスによって継承され、派生クラスの初期化に使用できます。

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");
}

上記のコードでは、 Derived1Derived2両方に、引数を直接Base対応するコンストラクタに転送するコンストラクタがあります。 Derived1ながら、明示的に転送を行うDerived2ので暗黙し、継承コンストラクタのC ++ 11機能を使用して、。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow