サーチ…
前書き
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機能を使用して、。