Почему удаление с использованием пространства имен std вызывает ошибки в моем проекте?

У меня проблема с включением заголовочных файлов в C ++. Насколько я знаю, это не очень хороший дизайн using namespace std внутри заголовка, но я получаю сообщение об ошибке, когда пытаюсь его удалить. Вот мой код в заголовочном файле:

#include <iostream>
#include <string>

//using namespace std;
class Messages
{
public:
Messages(string sender, string recipient,int time);
void append();
string to_string();private:
int time;
string sender;
string recipient;
string text;

};

Я включил <string>, Однако, если я не использую пространство имен std, все мои строки показывают ошибки. Я не хочу добавлять using namespace std в заголовочном файле, потому что это плохой дизайн. Так как мне это исправить?

Заранее спасибо.

2

Решение

Просто пиши std::string везде.

#include <iostream>
#include <string>

//using namespace std;
class Messages
{
public:
Messages(std::string sender, std::string recipient,int time);
void append();
std::string to_string();private:
int time;
std::string sender;
std::string recipient;
std::string text;

};

Как правило: всякий раз, когда (даже в файлах .cpp) вы используете какой-либо тип данных или алгоритмы из стандартной библиотеки, просто добавьте к нему префикс std::, Он достаточно короткий, чтобы напечатать, и он спасет вас от боли.

У продвинутых пользователей есть несколько причин использовать объявления в области действия функции, например, когда вы хотите перегрузить функцию (например, swap) из стандартной библиотеки для работы с собственными типами данных (внутри их собственных пространств имен). Смотрите, например этот вопрос& о том, как это работает.

5

Другие решения

Класс string объявлен внутри Пространство имен std, У вас есть три способа обращения к классу, который находится в другом пространстве имен:

  1. Всегда писать <namespace>::<class>
  2. Явно заявив, что любая ссылка на <class> на самом деле означает 1. выше: using <namespace>::<class>;,
  3. Объявив, что любая ссылка на <class> что не может быть решено в ток пространство имен также должно быть найдено в дополнительном пространстве имен: using namespace <namespace>;

Те отсортированы в порядке убывания выразительности. Хотя 1. совершенно ясно, где бы он ни был написан, 3. может потребоваться поиск и почесывание головок, если вы не знакомы с (возможно, несколькими) используемыми пространствами имен.

Они также сортируются в порядке убывания, поэтому некоторые люди (и особенно учебники) выбирают 3.

Тем не менее, вы должны никогда использование using ... в файле заголовка, потому что вы не только возитесь с разрешением пространства имен внутри вашего заголовка, но и с разрешением каждого в том числе ваш заголовок Это приводит к коллизиям пространства имен, странным ошибкам в зависимости от порядка включений и множеству других головных болей. Просто не надо.

И вообще говоря, в то время как есть некоторые за и против, связанные с вариантами 1. и 2. в реализация Файлы, вариант 3. просто оскорбительный для тех, кто будет работать с вашим источником позже.

3

По вопросам рекламы [email protected]