Quando scrivo seguente codice che viene compilato ed eseguito correttamente:Perché l'uso della direttiva si comporta in modo diverso nell'ambito globale e nell'ambito locale?
#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;
}
Ma se scrivo usando le direttive di fuori funzione principale come segue,
using namespace first; //using derective
using second::y;
int main() {
cout << x << endl;
cout << y << endl;
return 0;
}
Si dà questo errore di compilazione:
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
Qualcuno può spiegare perché l'uso della direttiva si comporta diversamente quando viene utilizzato all'interno di main
e all'esterno dello main
?
Grazie Jesse per una rapida risposta ... Per favore correggimi se ho torto ... Ma quando si usano le direttive sono ancora nella funzione principale ci saranno 2 dichiarazioni di y. In tal caso, perché il compilatore dà problemi solo nel secondo caso? – Amrit
@ user2235938: Esistono due dichiarazioni di 'y', ma la dichiarazione di utilizzo dichiara' second :: y' all'interno di main, mentre 'first :: y' è dichiarato nello scope namespace globale. Poiché 'second :: y' è dichiarato all'interno di main, nasconde' first :: y'. Hai familiarità con il nascondiglio del nome? –
Scusa Jesse ... Ma non sono in grado di capire. quando entrambe le istruzioni "usano prima namespace; usando second :: y;" sono all'interno della funzione principale dovrebbe dichiarare sia first :: y che second :: y in ambito locale e dare errore di compilazione. Ma non funziona e programma la compilazione e funziona correttamente. E quando entrambe le affermazioni sono fuori lato, non vengono nemmeno compilate a causa dell'ambiguità. Spiega gentilmente ... – Amrit