Джонатан уже возобновил различия между using namespace foo;
и using foo::Bar;
, но я думаю, что его ответ, к сожалению, неполный.
Первое: using namespace
никогда не должно появляться в заголовочном файле. Это может сделать невозможным использование в сочетании с другими заголовочными файлами из-за столкновения символов ...
Второе: в общем, вы должны стараться максимально ограничить область действия символов, вы, вероятно, уже делаете это при написании кода:
for (size_t i = 0; i < 5; ++i)
{
std::string myString = myVec.at(i);
if (myString == "Foo") { std::cout << "Found"; break; }
}
Здесь было бы бесполезным (и загрязняющим) объявить myString
вне цикла for
. На самом деле, этот самый совет можно найти в ряде книг:
Из Скотта Мейерса Действующий C ++ , пункт 26: Отложить определения переменных как можно дольше .
Из Херба Саттера и Андрея Александреску C ++ Стандарт кодирования , позиция 18: Объявление переменных как можно локально
Нет причин не делать то же самое с using
декларациями.
Третье: рассмотреть альтернативы using
: псевдонимы пространства имен и typedef
.
// foo.h
class Foo
{
public:
std::vector<std::string> getSynonyms(const std::string& s) const;
private:
typedef std::map< std::string, std::vector<std::string> > synonyms_type;
synonyms_type mSynonyms;
};
// foo.cpp (never in header, at general scope)
namespace fu = boost::fusion;
std::vector<std::string> Foo::getSynonyms(const std::string& s) const
{
synonyms_type::const_iterator it =
std::find(mSynonyms.begin(), mSynonyms.end(), s);
std::vector<std::string> result;
if (it != mSynonyms.end()) { result = it->second; }
return result;
}
В чем преимущества?
- Псевдоним пространства имен> уменьшает почти столько же ввода, не вставляя типы прямо в текущую область, поэтому без риска
- typedef> уменьшает количество набираемых текстов более чем на
using
и позволяет легко изменять базовый тип.