2010-09-14 7 views
5

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?

+1

è io o è un esempio davvero difficile da leggere, con questi identificatori particolari? –

+0

Preet: non è solo per te. –

+0

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

risposta

2

Credo che sia un bug, per 7.3.4 comma 1 del C++ 03 di serie:

A utilizzando-direttiva specifica che i nomi nello spazio dei nomi nominato possono essere utilizzati nel campo di applicazione in cui la direttiva using appare dopo la direttiva using.

Pertanto, l'end-of-file che utilizza la dichiarazione non dovrebbe avere alcun effetto.

5

Sono d'accordo che si tratta di un bug, ma alcune informazioni su ciò che sta accadendo possono essere risolte generando l'elenco assembly corrispondente al file (utilizzare l'opzione/Fa di cl.exe).

Quindi, commentare la dichiarazione using, generare il file .asm e aprirlo in un editor di testo. Esegui la scansione del file e puoi vedere che l'istanziazione del modello si trova nella parte inferiore del file (inizia con [email protected]@[email protected]@[email protected] PROC) ed è sotto l'assembly generato per la funzione principale (inizia con _main PROC). Il messaggio di errore diceva "Vedi riferimento all'istanziazione del modello di funzione", quindi si riferisce all'istanziazione della funzione modello e l'elenco di assembly rende chiara questa istanza nella parte inferiore del file.

Ora, modificare il codice per sostituire la funzione modello con NonTemplatedFunction(int a) e compilarlo, generando un elenco di assiemi. Visualizza l'elenco di assembly e vedrai il codice assembly generato per NonTemplatedFunction(int a) visualizzato sopra _main PROC.

Cosa significa tutto questo? Quando il compilatore di Visual Studio 2008 trasforma i modelli in codice effettivo, aggiunge in modo efficace un codice alla fine del file dopo l'utilizzo della dichiarazione. La tua dichiarazione d'uso indica che i nomi nel codice generato automaticamente sono "ambigui". Il processo che gcc usa per istanziare i template ovviamente evita questo problema.

+0

+1: se lo si è modificato in una funzione non basata su modelli, Intellisense si lamenterà ma il file verrà compilato. – Puppy

Problemi correlati