2012-03-24 12 views
2

可能性の重複:
Scoped using-directive within a struct/class declaration?
Why “using namespace X;” is not allowed inside class/struct level?なぜC++構造体でnamespaceディレクティブを使用できないのですか?

私は構造体にだけはstd ::文字列を紹介したいと思います。 以下はなぜ違法とみなされますか? C++は異なる意味で同じキーワードを使用しています。

#include <iostream> 
#include <string> 

struct Father 
{ 
    using std::string; 

    string sons[20]; 
    string daughters[20]; 
}; 

しかし、奇妙なことに、私は

int main() 
{ 
    using std::string; 
} 

機能で、次の更新を行うことができます。

C++は、基本クラスから現在のクラスにデータメンバーまたは関数を導入するためにキーワード "using"を使用します。したがって、struct宣言内でstd :: stringを使用して記述したとき、コンパイラは、基本クラスstdからメンバーを導入しようとしていると仮定しています。しかし、stdは基本クラスではなく、むしろ名前空間です。 したがって

struct A 
{ 
    int i; 
} 

struct B:A 
{ 
    using A::i; // legal 
    using std::string// illegal, because ::std is not a class 
} 

同じ「使用」キーワードは、特定の名前空間のメンバーにアクセスするために使用されます。

私は、コンパイラが、宣言されている場所に基づいて "使用する"の意味を決定すると推測しています。

+2

**質問を編集する際に、自動的に挿入された「重複している可能性のあるリンク」を削除しないでください**。提案された質問と重複していないと思われる理由を説明するために更新したことを理解しています。しかし、あなたの編集内容は質問に盛り上がって、リストに気づいたユーザーから再投票を引きつけるか、または「フラグ」リンクを使用して仲裁者にあなたの更新ごとにそれを検討して再度開くように依頼する必要があります。自動的に挿入されたリンクを削除することは避けてください。再開時にシステムがそれを取り除きます。 –

+0

(この場合は事故だった、つまり編集が時間内に衝突した場合は、苛酷な音色をお詫び申し上げます。 –

答えて

2

私はあなたの実際の質問への答えを知らないが、あなたはのtypedefを使用することができます。

struct Father 
{ 
    typedef std::string string; 

    string sons[20]; 
    string daughters[20]; 
}; 
0

それはただ、残念ながら、言語によって許可されますが、回避策はありますないです。

namespace Father_Local 
{ 
    using std::string; 

    struct Father 
    { 
     //... 
    }; 
} 

using Father_Local::Father; 

このアプローチの利点は、原則としてusingディレクティブを書くことができるということです。

using namespace boost::multi_index; 

ここで、ヘッダファイルに入力したり混乱させたりする負荷を軽減できます。これは残りのコードには影響しません。父は最後に使用することによって適切な名前空間にインポートされ、すべて正常に動作します。

関連する問題