Ограничение использования директив `using` текущим файлом

Извините за этот глупый вопрос, но есть ли способ ограничить using директивы текущим файлом, чтобы они не распространялись на файлы, которые #include этого файла?


person missingfaktor    schedule 05.04.2010    source источник
comment
Однако вы можете ограничить использование директив областью действия, не относящейся к файлам, например, пространством имен или функцией.   -  person Steve Jessop    schedule 05.04.2010
comment
Гораздо лучше не применять директиву using в заголовках.   -  person David Rodríguez - dribeas    schedule 05.04.2010
comment
@David: я ненавижу печатать что-то вроде std::map<std::string, std::tr1::tuple<int, std::string> >, когда могу ввести map<string, tuple<int, string> >.   -  person missingfaktor    schedule 05.04.2010


Ответы (3)


Возможно, обертывание кода, который будет включен в его собственное пространство имен, может обеспечить желаемое поведение
, поскольку пространства имен влияют на область действия.

// 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
...
person Nick Dandoulakis    schedule 05.04.2010
comment
Эй, крутой трюк! Думаю, я выберу этот; Большое спасибо! :) - person missingfaktor; 05.04.2010

Нет, поэтому не следует использовать директивы using в файлах заголовков или любых других файлах, которые вы #include.

person Community    schedule 05.04.2010
comment
Чтобы немного расширить это, препроцессор (который обрабатывает #include и другие #-команды) запускается до того, как компилятор увидит код. Директива using и любые другие стандартные ключевые слова обрабатываются компилятором. Таким образом, с точки зрения компилятора заголовочные файлы на самом деле не являются отдельными файлами — это код, который находится в каждом файле, в котором они #include, и, следовательно, любые директивы using, которые вы можете поместить в их. - person Amber; 05.04.2010
comment
Ааа... грустно. Спасибо за ответ в любом случае. - person missingfaktor; 05.04.2010
comment
@Rahul Это не так уж плохо - вы можете (и должны), конечно, использовать директивы using в своих файлах .cpp. - person ; 05.04.2010

Технически вы должны иметь возможность импортировать их в какое-то внутреннее пространство имен, а затем сделать вещи, объявленные в нем, видимыми в пространстве имен, предназначенном для пользователя.

#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';
}

Не уверен, стоит ли это того и насколько хорошо он работает с «поиском, зависящим от аргумента».

person visitor    schedule 05.04.2010
comment
Действительно слишком много хлопот. Но все же хорошая работа вокруг. Итак, +1. :) - person missingfaktor; 05.04.2010