5

このばかげた質問で申し訳ありませんが、usingディレクティブを現在のファイルに制限して、このファイルのファイルに伝播しないようにする方法はあり#includeますか?

4

3 に答える 3

15

いいえ、ありません。そのため、ヘッダーファイルや#includeするその他のファイルでディレクティブを使用しないでください。

于 2010-04-05T08:46:31.580 に答える
4


名前空間はスコープに影響を与えるため、おそらく、独自の名前空間内に含まれるようにコードをラップすることで、目的の動作を実現できます。

// FILENAME is the file to be included
namespace FILENAME_NS {
   using namespace std;
   namespace INNER_NS {
      [wrapped code]
   }
}
using namespace FILENAME_NS::INNER_NS;

と他のファイルで

#include <FILENAME>
// std namespace is not visible, only INNER_NS definitions and declarations
...
于 2010-04-05T10:34:46.530 に答える
4

技術的には、それらを内部名前空間にインポートして、その中で宣言されているものをユーザー向けの名前空間に表示できるようにする必要があります。

#ifndef HEADER_HPP
#define HEADER_HPP

#include <string>

namespace my_detail
{
    using std::string;
    inline string concatenate(const string& a, const string& b) { return a + b; }   
}

namespace my_namespace
{
    using my_detail::concatenate;
}

#endif

#include <iostream>
#include "header.hpp"

using namespace my_namespace;

int main() 
{
    std::  //required
    string a("Hello "), b("world!");
    std::cout << concatenate(a, b) << '\n';
}

トラブルに見合う価値があるかどうか、そして「引数依存のルックアップ」でどれだけうまく機能するかはわかりません。

于 2010-04-05T10:35:29.630 に答える