2013-05-22 6 views
2

У меня есть проблема с включением файлов заголовков в C++. Насколько мне известно, неплохой дизайн для размещения внутри заголовка using namespace std, но я получил некоторую ошибку, когда пытаюсь его удалить. Вот мой код в файле заголовка:Почему удаление с использованием пространства имен 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 в заголовочный файл, потому что это плохой дизайн. Так как я могу это исправить?

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

+3

Только wirte 'std :: string' вместо' string' – Lucas

+0

укажите пространство имен: 'std :: string'. – hmjd

+6

Условные вводные учебники с использованием 'using namespace std;' do ... –

ответ

5

Просто напишите 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) из стандартной библиотеки для работы с вашими собственными типами данных (внутри их собственных пространств имен). См. this Q&A о том, как это работает.

+0

О, хорошо, спасибо. – Yvonne

+0

рад помочь! – TemplateRex

2

Класс string указан в пространстве имен std. У вас есть три пути решения класса, который находится внутри другого пространства имен:

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

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

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

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

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