Ограничение директив `using` текущим файлом - PullRequest
5 голосов
/ 05 апреля 2010

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

Ответы [ 3 ]

15 голосов
/ 05 апреля 2010

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

4 голосов
/ 05 апреля 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';
}

Не уверен, стоит ли эта проблема и насколько хорошо она играет с "аргументно-зависимым поиском".

4 голосов
/ 05 апреля 2010

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

// 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
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...