Le funzioni all'interno di uno spazio dei nomi non dovrebbero essere accessibili solo utilizzando lo scope dei nomi o la direttiva using?Perché alcune funzioni all'interno di un namespace sono accessibili senza il prefisso scope dello spazio dei nomi?
Sto riscontrando un problema in cui determinate funzioni, definite all'interno di uno spazio dei nomi, sono accessibili FUORI da tale spazio dei nomi. Credo che ci dovrebbe essere un errore del compilatore, ma non ne trovo uno sui tre diversi compilatori che ho provato (VS.NET 2003, VS2010 e GCC 4).
Ecco il codice:
namespace N{
typedef struct _some_type *some_type;
struct some_struct { int x; };
void A(void);
void B(int);
void C(some_type*);
void D(some_type);
void E(struct some_struct);
}
using N::some_type;
using N::some_struct;
void TestFunction()
{
some_type foo;
some_struct s;
N::A(); //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
::A(); //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
A(); //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
N::B(0); //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
::B(0); //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
B(0); //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
N::C(&foo); //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
::C(&foo); //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
C(&foo); //shouldn't compile (but does on VS2003, VS2010, and GCC 4.1.2) -- problem!
N::D(foo); //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
::D(foo); //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
D(foo); //shouldn't compile (but does on VS2003, VS2010, and GCC 4.1.2) -- problem!
N::E(s); //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
::E(s); //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
E(s); //shouldn't compile (but does on VS2003, VS2010, and GCC 4.1.2) -- problem!
}
Nessuna delle funzioni deve essere accessibile senza l'uso della N :: prefisso, ma C, D, ed E sono per qualche motivo sconosciuto. Inizialmente pensavo che si trattasse di un bug del compilatore, ma poiché lo sto vedendo su più compilatori mi fa dubitare di cosa sta succedendo.
Ho pensato che si trattasse di un "bug del vecchio compilatore", ma che è stato compilato anche su gcc 4.6. – mfontanini
La mia ipotesi migliore è il fatto che tu abbia queste righe: 'usando N :: some_type;' e 'usando N :: some_struct;' e i tipi di ritorno di C, D ed E sono quei tipi. – gcochard
Greg, puoi rimuovere gli usi e succede ancora. Anche i tipi di restituzione di tutte le funzioni sono nulli. – syplex