Извините за этот глупый вопрос, но есть ли способ ограничить using
директивы текущим файлом, чтобы они не распространялись на файлы, которые #include
этого файла?
Ограничение использования директив `using` текущим файлом
Ответы (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
Эй, крутой трюк! Думаю, я выберу этот; Большое спасибо! :)
- person missingfaktor; 05.04.2010
Нет, поэтому не следует использовать директивы using в файлах заголовков или любых других файлах, которые вы #include.
person
Community
schedule
05.04.2010
Чтобы немного расширить это, препроцессор (который обрабатывает
#include
и другие #
-команды) запускается до того, как компилятор увидит код. Директива using
и любые другие стандартные ключевые слова обрабатываются компилятором. Таким образом, с точки зрения компилятора заголовочные файлы на самом деле не являются отдельными файлами — это код, который находится в каждом файле, в котором они #include
, и, следовательно, любые директивы using
, которые вы можете поместить в их.
- person Amber; 05.04.2010
Ааа... грустно. Спасибо за ответ в любом случае.
- person missingfaktor; 05.04.2010
@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
Действительно слишком много хлопот. Но все же хорошая работа вокруг. Итак, +1. :)
- person missingfaktor; 05.04.2010
using
в заголовках. - person David Rodríguez - dribeas   schedule 05.04.2010std::map<std::string, std::tr1::tuple<int, std::string> >
, когда могу ввестиmap<string, tuple<int, string> >
. - person missingfaktor   schedule 05.04.2010