0

コードで名前空間を使用しようとしているので、次のようなヘッダー ファイルがあります。

#include <string>

namespace AppNamespace
{
  class A
  {
    std::string name;
  };
}

これをコンパイルしようとすると、「'string' は AppNamespace::std のメンバーではありません」と表示されます。文字列の前を削除するstd::か、または と書く::std::string nameと、正常にコンパイルされます。

もちろん、これは単純化された例です。私は多くのヘッダー ファイルを持っていますが、すべてがこの動作を示すわけではありません。何が原因なのかはわかりませんが、コンパイラは常にグローバル名前空間も試行すると考えていました。

これが問題になる場合、私は現在 Visual Studio 2012 を使用しています。

4

2 に答える 2

1

もちろん、これは単純化された例です。私は多くのヘッダー ファイルを持っていますが、すべてがこの動作を示すわけではありません。何が原因なのかはわかりませんが、コンパイラは常にグローバル名前空間も試行すると考えていました。

ある時点で、次のようなものが必要です。

namespace AppNamespace
{
  #include <string> // or #include "my_header" which in turn includes <string>

  class A
  {
    std::string name;
  };
}

ディレクティブは#include名前空間を尊重しません。それらをすべてグローバル名前空間スコープに移動する必要があります。そうしないと、標準ヘッダーを (ネストされている可能性がある) 含めるたびに、ネストされた名前空間を作成するという形で未定義の動作が発生しますstd

于 2013-11-07T04:18:20.400 に答える
0

使用:

using namespace std;

#include <iostream>
#include "test_header.h"

int main() ...

コードは、上記の例をヘッダーとして使用して、どちらの方法でもコンパイルされます。

移動中

名前空間 std を使用します。

std::string を使用しないと、ヘッダー ファイル (私の場合は test_header.h) の下にエラーが発生します。

それはあなたが抱えている問題ですか?

于 2013-11-07T04:25:01.470 に答える