2015-05-27 1 views
9

Этот файл C++ ...Почему пространство имен не используется для использования при использовании директивы пространства имен?

namespace foo { 
    class C { 
     void m(); 
    }; 
    void f(); 
} 

using namespace foo; 

void C::m() {} 
void f() {} 

..Compiles в объектный файл с этими символами:

$ g++ foo.cpp -c 
$ nm foo.o -C 
000000000000000a T f() 
0000000000000000 T foo::C::m() 

Почему C::m()? получить пространство имен предваряться, но не f()?

(I I вместо using namespace foo использование namespace foo {...}, тогда оба названия имеют foo доп.).

+0

Как показывает ответ, не спешите делать выводы при написании вопросов. Если что-то удивительно, лучше быть осторожным в том, как вы приближаетесь к кажущемуся противоречию и спрашиваете что-то вроде «Различия в связях»? вместо того, чтобы предполагать, что это происходит (поскольку связь не имеет ничего общего с вашей ситуацией, все задействованные связи являются внешними). –

+1

@KerrekSB Я обновил заголовок, чтобы не делать предположений о причине. (Слишком часто я смешиваю связь, объем и распределение памяти при работе с C++). –

+0

Очень ценим! –

ответ

12

В void C::m() {}, C::m - это квалифицированное имя, и такое определение всегда относится к ранее объявленному. Компилятор просматривает C, находит, что C на самом деле foo::C, с помощью с использованием директивы, и в качестве определения foo::C::m() требуется void C::m(){}.

Когда вы пишете void f() {}, это неквалифицированное имя, и оно всегда объявляет функцию в текущем пространстве имен, которое является глобальным пространством имен.

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