2015-11-02 9 views
5

は、以下の2つのusingの文を考えてみましょう:using後、両方の方法は、(修飾子なし)私たちに直接使用MyTypeを可能と思われタイプ=の使用と使用の違いは?

using ::space1::space2::MyType; 
using MyType = ::space1::space2::MyType; 

この2つの違いは何ですか?

+2

よく、一例として、第二の発現を使用することができます'Foo = Bar 'のようなエイリアスを定義することもできますが、最初のものはできません。とにかく、最初の例では既存の名前をエクスポートし、2番目の例では新しいエイリアスを作成しています。 – skypjack

+0

最初のものは[using declaration](http://en.cppreference.com/w/cpp/language/namespace#Using-declarations)で、2番目のものは[namespace alias]です(http://en.cppreference .com/w/cpp/language/namespace_alias)。 – crayzeewulf

+0

@crayzeewulfは質問のタイトルとして言及していますが、2番目の名前はnsエイリアスではなく[タイプエイリアス](http://en.cppreference.com/w/cpp/language/type_alias)です。 – Christophe

答えて

2

最初のケースでは、実際には名前空間からusing宣言を含む名前に名前をエクスポートしていますが、2番目のケースではusingステートメントを含む名前空間に別名を定義していますその特定の名前とその周囲の名前空間を指しています。最初using式は、それは名前がものとは異なる空間で利用できるようにできるようにするだけで機能することはできませんが

using Foo = Bar<MyClass>; 

template <class C> 
using Foo = Bar<C, MyClass>; 

:二式で次のようなエイリアスを定義することができる例として

、それらを含む。

宣言とエイリアス(型とテンプレート)を使用したディレクティブの使用の詳細については、hereを参照してください。

1

最初の変数/タイプは、で修飾されていないという名前で参照できます。

もう1つは、新しいの型名を囲む名前空間に宣言します。

1

skypjackの素晴らしい答えに加えて、記録のためには、statemetnsがクラス定義内で使用されるときには別の違いがあります。クラス定義内

タイプエイリアスがまだタイプの別名であり、一方、使用宣言は、基本クラスのメンバーを紹介しなければならない:

namespace space1 { namespace space2 { class MyType {}; } } 

struct s1 { 
    using ::space1::space2::MyType; // error 
    MyType b; 
}; 
struct s2 { 
    using MyType = ::space1::space2::MyType; // perfectly valid 
    MyType a; 
}; 
+0

あなたは絶対に正しいです、私は私の応答でクラス定義に囲まれているとは考えていません、私のせいです。ありがとうございました。 – skypjack

関連する問題