Ho trovato che questo strano caso di codice (di seguito) non viene compilato in Visual Studio 2008 e genera un "errore C2872: 'Ambiguità': simbolo ambiguo "on line 12.Bug del compilatore VS2008 (+?) Con funzioni basate su modelli e 'using namespace'
Rimuovere l'utilizzo di namespace RequiredNamespace
sull'ultima riga corregge l'errore, ma mi aspetto che mettere using namespace
alla fine di un file non abbia alcun effetto. Si basa anche su AnotherFunction
come una funzione di modello, quindi mi aspetto che il compilatore stia generando le funzioni basate su modelli nell'ambito errato oppure non sta reimpostando l'elenco degli spazi dei nomi utilizzati prima di farlo.
Lo stesso codice viene compilato in GCC.
Entrambi i compilatori sembrano generare il codice per TemplatedFunction
dopo la definizione using namespace Namespace
, almeno per quanto posso dire introducendo errori e osservando l'ordine in cui vengono emessi.
namespace Ambiguity
{
class cSomeClass
{
};
template<class T>
void TemplatedFunction(T a)
{
// this is where the error occurs, the compiler thinks Ambiguity
// might refer to the class in RequiredNamespace below
Ambiguity::cSomeClass();
}
}
namespace RequiredNamespace
{
// without a namespace around this class, the Ambiguity class
// and namespace collide
class Ambiguity
{
};
}
int main()
{
// to force the templated function to be generated
Ambiguity::TemplatedFunction(4);
}
// removing this removes the error, but it shouldn't really do anything
using namespace RequiredNamespace;
Ovviamente questo è un esempio di manufatto, ma l'originale viene estratto da un caso reale in cui il using namespace
è in un file generato automaticamente il codice prodotto da terze parti.
Si tratta di un bug nel compilatore?
è io o è un esempio davvero difficile da leggere, con questi identificatori particolari? –
Preet: non è solo per te. –
Come posso renderlo più semplice?Immagino che parte del problema sia che, se le convenzioni di denominazione sono state seguite, il problema non si verificava - se per esempio hai anteposto le tue classi con c, non avresti una classe chiamata Ambiguity. L'ho ottimizzato un po '. – eAi