У меня проблема с включением заголовочных файлов в 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
в заголовочном файле, потому что это плохой дизайн. Так как мне это исправить?
Заранее спасибо.
Просто пиши 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
) из стандартной библиотеки для работы с собственными типами данных (внутри их собственных пространств имен). Смотрите, например этот вопрос& о том, как это работает.
Класс string
объявлен внутри Пространство имен std
, У вас есть три способа обращения к классу, который находится в другом пространстве имен:
<namespace>::<class>
<class>
на самом деле означает 1. выше: using <namespace>::<class>;
,<class>
что не может быть решено в ток пространство имен также должно быть найдено в дополнительном пространстве имен: using namespace <namespace>;
Те отсортированы в порядке убывания выразительности. Хотя 1. совершенно ясно, где бы он ни был написан, 3. может потребоваться поиск и почесывание головок, если вы не знакомы с (возможно, несколькими) используемыми пространствами имен.
Они также сортируются в порядке убывания, поэтому некоторые люди (и особенно учебники) выбирают 3.
Тем не менее, вы должны никогда использование using ...
в файле заголовка, потому что вы не только возитесь с разрешением пространства имен внутри вашего заголовка, но и с разрешением каждого в том числе ваш заголовок Это приводит к коллизиям пространства имен, странным ошибкам в зависимости от порядка включений и множеству других головных болей. Просто не надо.
И вообще говоря, в то время как есть некоторые за и против, связанные с вариантами 1. и 2. в реализация Файлы, вариант 3. просто оскорбительный для тех, кто будет работать с вашим источником позже.