gdy piszę następujący kod pobiera skompilowany i wykonany prawidłowo:Dlaczego stosowanie dyrektywy zachowuje się inaczej w zasięgu globalnym i zasięgu lokalnym?
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main() {
using namespace first; //using derective
using second::y;
cout << x << endl;
cout << y << endl;
return 0;
}
Ale jeśli piszę używając dyrektyw poza funkcją głównego następująco,
using namespace first; //using derective
using second::y;
int main() {
cout << x << endl;
cout << y << endl;
return 0;
}
Daje ten błąd kompilacji:
g++ namespace03.cpp -o namespace03
namespace03.cpp: In function ‘int main()’:
namespace03.cpp:20:11: error: reference to ‘y’ is ambiguous
namespace03.cpp:13:10: error: candidates are: double second::y
namespace03.cpp:7:7: error: int first::y
make: *** [namespace03] Error 1
Czy ktoś może wyjaśnić, dlaczego używanie dyrektywy zachowuje się inaczej, gdy jest używane wewnątrz main
i poza main
?
Dziękuję Jesse za szybką odpowiedź ... Proszę, popraw mnie, jeśli się mylę ... Ale kiedy używa się dyrektyw, to w głównej funkcji wciąż będą 2 deklaracje y. Jeśli tak, to dlaczego kompilator daje problem tylko w drugim przypadku? – Amrit
@ user2235938: Istnieją dwie deklaracje typu "y", ale deklaracja użycia deklaruje "second :: y" wewnątrz głównej, a "first :: y" jest zadeklarowana w zasięgu globalnego obszaru nazw. Ponieważ 'second :: y' jest zadeklarowane wewnątrz main, ukrywa' first :: y'. Czy znasz ukrywanie nazwy? –
Przepraszam Jesse ... Ale nie jestem w stanie zrozumieć. gdy obie instrukcje "najpierw używają przestrzeni nazw, używając second :: y;" znajdują się w głównej funkcji, która powinna zadeklarować zarówno first: y jak i second :: y w zasięgu lokalnym i dać błąd kompilacji. Ale nie działa i programuje kompilację i działa poprawnie. A jeśli oba stwierdzenia są poza głównym źródłem, to nawet nie są kompilowane z powodu niejednoznaczności. Wyjaśnij proszę ... – Amrit