2009-09-10 2 views
4

Мне хорошо известно об использовании пространств имен, но время от времени я натыкаюсь на использование, которое использует определенный класс. Например:Вопрос о «использовании» ключевого слова

#include <string> 
using namespace std; 
(...) 

Однако - каждый сейчас и потом, я вижу:

using std::string; 

Как следует интерпретировать «используя» в данном случае?

Приветствие

ответ

23

с использованием зОго :: строки просто импортирует зЬй :: строки в текущую область видимости (он же, вы можете просто использовать «строку» вместо «станда :: строка») без импорта все из :: Std в текущий объем.


Редактировать: уточнение после комментария.

+1

Целью этого является не загрязнять текущее пространство имен ВСЁ из другого пространства имен. Например, пространство имен std содержит много вещей. Если вам не нужна большая часть этого, то глупо делать «использование std» и приносить все это. –

+4

Общим правилом является никогда не использовать «использование ...» в заголовках библиотеки, поскольку вы загрязняете пространство имен для пользователей библиотеки. Имейте в виду: нет способа отменить «использование». – jdehaan

3

В этом случае он позволяет вам привязываться к определенному типу в пространстве имен без квалификации. В отличие от первого случая, который позволяет вам привязываться к любому типу.

3

Вы можете использовать класс string без помещения std :: перед ним. Однако, если вы хотите использовать что-то еще, например, вектор, то вам нужно использовать std::vector

12

using namespace foo позволяет получить доступ ко всем именам в пространстве имен foo без квалификации. using foo::bar позволяет использовать bar без квалификаций, но не любых других имен в foo.

1

тоже делают вещи более сложными, это можно сделать:

class Base { 
protected: 
    void f(); 
}; 
class Fun: public Base { 
public: 
    using Base::f; 
}; 

и теперь у вас есть хороший публичный метод.

Смежные вопросы