La direttiva using
Qualificare totalmente gli identificatori appartenenti ad un namespace puo`
essere molto noioso, soprattutto se siamo sicuri che non ci sono conflitti con
altri namespace. In questi casi ci viene in aiuto la direttiva using ,
che abbiamo gia` visto in numerosi esempi:
#include "MikeLib.h"
using namespace MikeLib;
using namespace SamLib;
/* ... */
La direttiva using utilizzata in congiunzione con la keyword importa
in un colpo solo tutti gli identificatori del namespace specificato nello scope
in cui appare la direttiva (che puo` anche trovarsi nel corpo di una funzione):
#include "MikeLib.h"
#include "SamLib.h"
using namespace MikeLib;
// Da questo momento in poi non e` necessario
// qualificare i nomi del namespace MikeLib
void MyFunc() {
using namespace SamLib;
// Adesso in non bisogna qualificare
// neanche i nomi di SamLib
/* ... */
}
// Ora i nomi di SamLib devono
// essere nuovamente qualificati con ::
/* ... */
Naturalmente se dopo la using ci fosse una nuova definizione di
identificatore del namespace importato, quest'ultima nasconderebbe quella del
namespace. L'identificatore del namespace sarebbe comunque ancora raggiungibile
qualificandolo totalmente:
#include "SamLib.h"
using namespace SamLib;
int Pi = 5; //
Nasconde la definizione
// presente in SamLib
int a = Pi; //
Riferisce al precedente Pi
double b = SamLib::Pi; // Pi di samLib
Se piu` direttive using namespace fanno si` che uno stesso nome
venga importato da namespace diversi, si viene a creare una potenziale situazione
di ambiguita` che diviene visibile (genera cioe` un errore) solo nel momento
in cui ci si riferisce a quel nome. In questi casi per risolvere l'ambiguita`
basta ricorrere ricorrere al risolutore di scope (:: ) qualificando
totalmente il nome.
E` anche possibile usare la using per importare singoli nomi:
#include "SamLib.h"
#include "MikeLib"
using namespace MikeLib;
using SamLib::Sum(int, int);
void F() {
PiType a = Pi; // Riferisce
a MikeLib
int r = Sum(5, 4); // SamLib::Sum(int,
int)
}
|