2012-05-04 9 views
0

私は自分のコードでstdを含む多くの名前空間を使用していますので、コード内に文字列変数を宣言したいときは、正確なstd :: stringか文字列を入れることができます:std :: stringと文字列

#include <string.h> 

using namespace std; 
using namespace boost; 
using namespace xerces; 

int main() 
{ 
    /*! should I declare my str like this */ 
    std::string str; 
    /*! or I can declare it like this */ 
    string str1; 
    cout << str << str1 <<endl; 
    return 0; 
} 
+3

これは 'using'が対象です: –

+7

' #include 'はあなたに' std :: string'宣言をもたらしません。 –

+6

[なぜ 'namespace std;を使用していますか? C++での悪い習慣と考えていますか?](http://stackoverflow.com/a/1453605/140719) – sbi

答えて

9

using namespace std;なので、stringという名前はstd::string [*]と同じ意味です。したがって、あなたが好むスタイルの問題です(そしてstd::stringを好む場合は、using namespace std;を省略することができます)。

std::boost::の間にいくつかの名前の衝突があります。特に、標準化の前にブーストで試行されたものについては、いくつかの名前の衝突があります。たとえば、適切なヘッダーを含めると、std::shared_ptrboost::shared_ptrの両方が存在します。それらは同じタイプを参照することもしないこともありますが、Boostが独自の型を定義する前に標準型を検出しようとしているかどうかは確認していません。

stdboostの両方の名前空間を同時に使用することは必ずしも良い考えではありません。名前空間全体ではなく、using std::string;で個々の名前を使用できます。

[*] std::stringが定義されている場合は、<string>が含まれていないため、そうではありません。

+1

私はすでにそれを持っていますが、同じ名前を持つ2つの異なる名前空間の2つのクラスを自分のコードに必要としたらどうなりますか(もちろん同じ実装ではありません、私のコードはそのようなクラスです)私の呼び出されたクラスの前に名前空間の名前を正確にする必要がありますが、それをやったら、他の名前空間に似た名前を持たないクラスでもやってはいけませんか? – Glolita

+1

@Glolita:あなたの上司(あなたの上司があなたのスタイルガイドを書いた場合)はあなた次第です。名前の中にはあいまいさがあり、名前空間接頭辞が必要な場合もあるので、名前ごとに名前空間接頭辞を記述する必要はありません。 'string'を書こうとしていて、' string'の他の定義と衝突しない場合は、まず 'namespace std;'または 'std :: string;を使います。私は 'std :: string;を使うのが好きです。なぜなら、私はこれまで聞いたことがない名前の長いリストをインポートするのは好きでなく、将来のコンパイラのリリースで変更されるかもしれないからです。 –

+1

オハイオ州オハイオ州オハイオ州オハイオ州オハイオ州今私はそれをたくさんありがとう:) – Glolita

4

using namespace std;を使用すると、ちょうどstringとすることができます。

using namespace std;を追加すると、場合によっては名前空間間で競合が発生する可能性があるため(stringのunlikeyでは)、すべての場合に最適な方法ではない場合があります。

2

名前空間stdを使用しているため、stringの前にはstd::を追加する必要はありませんが、必要に応じてCANを使用することができます。

3

あなたは一般的なケースとしてusing namespace std;しかしを宣言した場合は通常、std::stringを指定する必要はありません同じ名前の異なるクラスを含む複数の名前空間がある場合、あなたは、次の名前空間を指定する必要がありますusingステートメントの有無にかかわらず、タイプ(namespace::type)を入力してください。

5

stringと書くことができます。しかし、boostまたはxercesにもシンボルstringがある場合はどうなりますか?これらの指示文を使用することをお勧めします。衝突する可能性があるのはstringだけではありません。基本的には、シンボル全体をグローバル名前空間に引き出しています。あなたが本当にstd::を入力しないようにしたいなら、あなたはのtypedefを使用することができます:コードへ

typedef std::string MyStr; 
+4

悪い:あなたが 'std :: string'と' boost :: strong'とタイプすることを意味する 'strong'とタイプするとどうなりますか? –

+0

@ R.MartinhoFernandes良い点。あるいは、最近私が見た質問のように、テンプレート化された 'set'関数があるとします。 – juanchopanza

0

良い方法は、名前空間の外にするときの#includeを露出しないようにするために、ヘッダーに関連するすべての名前空間を使用することではありません。しかし、コンパイルされたソースでは、std名前空間を使用してstd :: stringを呼び出すこともできます。場合によっては(同じ文字列クラスを定義する2つの名前空間を含めると)必要な場合もあります。

関連する問題