サーチ…
前書き
using宣言は、以前に他の場所で宣言されていた現在のスコープに単一の名前を導入します。
構文
- typename( opt ) ネストされた名前指定子 unqualified-idを使用します。
- :: unqualified-idを使用します。
備考
using宣言は区別されるusingディレクティブ 任意の名前を検索するときに、特定の名前空間に見えるようにコンパイラに指示します。 usingディレクティブは、 using namespaceをusing 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.fooはDerived1::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
}
継承コンストラクタ
特別な場合として、クラススコープでの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");
}
上記のコードでは、 Derived1とDerived2両方に、引数を直接Base対応するコンストラクタに転送するコンストラクタがあります。 Derived1ながら、明示的に転送を行うDerived2ので暗黙し、継承コンストラクタのC ++ 11機能を使用して、。