Декларации пространства имен C ++ внутри класса C ++ - PullRequest
2 голосов
/ 14 февраля 2020

У меня есть следующий класс RESTClient, который я планирую реализовать с использованием boost.beast. У меня есть следующие пространства имен, объявленные в заголовке.

namespace beast = boost::beast;
namespace http = beast::http;
namespace net = boost::asio;
using tcp = boost::asio::ip::tcp;

Однако я не хочу загрязнять глобальное пространство имен. Я хочу, чтобы namespce было объявлено внутри класса. Я попробовал описанную здесь технику Ошибки C ++ избегают глобальных пространств имен . Кажется, это не помогает. Что представляет собой элегантный способ перенести описанное выше определение пространства имен в класс

class RESTClient {
public:

    explicit RESTClient(std::shared_ptr<net::io_context> ioc, std::shared_ptr<Logger> logger, std::shared_ptr<Configuration> config);

    virtual ~RESTClient();

private:
    std::shared_ptr<Logger> m_logger;

};

1 Ответ

0 голосов
/ 14 февраля 2020

Язык просто не позволяет использовать using directive для пространства имен внутри класса. Поэтому код, подобный следующему, отклоняется компилятором. Даже использование псевдонима пространства имен в пределах области видимости является ошибкой.

class MyClass {
  using namespace std;  // error
  namespace s = std; // error
};

Наиболее вероятным решением для вас было бы объявление пространства имен (using namespace объявление) или псевдонимов пространства имен в пределах области функции.

struct X {
  void foo() {
    using namespace std;
    cout << "foo\n"; // without namespace
  }

  void bar() {
    std::cout << "bar\n"; // using fully qualified name
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...