0

私はコードでstdを含む多くの名前空間を使用しているので、コードで文字列変数を宣言する場合は、std :: stringを正確にするか、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;
}
4

6 に答える 6

9

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

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

stdしたがって、名前空間とboost名前空間の両方を同時に使用することは必ずしも良い考えではありません。using std::string;名前空間全体の代わりに、で個別の名前を使用できます。

[*]std::stringが定義されているが、含まれていないため、定義されていない<string>

于 2012-05-04T10:33:34.900 に答える
5

あなたはただ書くことができますstring。しかし、シンボルがある場合、boostまたはxercesシンボルがある場合はどうなりstringますか?usingこれらのディレクティブは使用しないことをお勧めします。string衝突する可能性があるのはそれだけではありません。基本的に、グローバル名前空間に大量のシンボルをプルしています。本当に入力を避けたい場合std::は、typedefを使用できます。

typedef std::string MyStr;
于 2012-05-04T10:34:44.033 に答える
4

使用するだけでstring置けますusing namespace std;

追加するusing namespace std;ことは、場合によっては名前空間間の競合につながる可能性があるため、すべての場合に最適なアイデアではない可能性があります(ただし、の場合はほとんどありませんstring)。

于 2012-05-04T10:28:27.993 に答える
3

通常、一般的なケースとしてBUTstd::stringを宣言したかどうかを指定する必要はありません。同じ名前の異なるクラスを含む複数の名前空間がある場合は、タイプ()の横に名前空間を指定する必要があります。ステートメント。using namespace std; namespace::typeusing

于 2012-05-04T10:32:09.243 に答える
2

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

于 2012-05-04T10:28:49.327 に答える
0

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

于 2012-05-04T10:49:27.570 に答える