2012-03-22 5 views
5

Il seguente codice sorgente viene compilato correttamente con Visual Studio 2010:codice compila in Visual Studio 2010, ma non deve compilare a tutti

namespace NS 
    { 
    class X 
     { 
     }; 
    X Y(X str); 
    } 

void myFun() 
    { 
    NS::X x; 
    Y(x); 
    } 

(questo codice è ridotta in cui sono stati sostituiti tutti i miei nomi di classi e funzioni X, Y, ...)

Mi aspetto che la riga Y(x) non riesca a compilare, poiché dovrebbe essere NS::Y(x).

Questo codice sorgente è stato compilato con il seguente comando

cl /c file.cpp 

Non ci sono altri file inclusi qui, senza altre opzioni della riga di comando.

Perché questo file viene compilato? Bug in VS2010? O qualcosa che io (e i miei altri 3 colleghi) abbiamo trascurato?

+1

ha provato questo con g ++ e ha ottenuto un riferimento non definito a NS :: Y (NS :: X) ''- quindi potrebbe essere un bug in VS .. – WeaselFox

+2

http://ideone.com/WzC6V –

+0

@WeaselFox : completamente estraneo. Il tuo errore è un errore * linker * perché 'NS :: Y' non è definito. È tipico e probabilmente verrà definito in un altro file in una configurazione completa. –

risposta

9

Quello che stai vivendo è dovuto a ADL (Argument Dependent Lookup).

Non c'è niente di sbagliato nel tuo snippet (oltre al fatto che il linker probabilmente si lamenta di NS::Y non è definito), ma dovrebbe compilare - VS2012 sta gestendo lo snippet come dovrebbe.

Il compilatore troverà NS::Y a causa del fatto che il tipo di parametro x (NS::X) è nello scope appropriato.


3.4.2Argument-dependent nome di ricerca [basic.lookup.argdep]

  1. Quando un nome non viene utilizzato come il suffisso-espressione in un Chiamata alla funzione (5.2.2), altri spazi dei nomi non considerati durante la ricerca standard non valida (3.4.1) possono essere cercati, e in quelli namespace, dichiarazioni di funzioni friend scope scope scope (11.4) non altrimenti visibile.

    Queste modifiche alla ricerca dipendono dai tipi degli argomenti (e per gli argomenti del modello di modello, lo spazio dei nomi dell'argomento del modello ).

  2. Per ogni argomento di tipo T nella chiamata di funzione, è presente un insieme di zero o più spazi dei nomi associati e un set di zero o più classi associate associate.

    Le serie di spazi dei nomi e le classi sono determinate interamente dai tipi degli argomenti della funzione (e dallo spazio dei nomi di qualsiasi argomento del modello di modello).

+0

Hai ragione, l'ho trovato anche su Wikipedia. Difficile. Non mi aspettavo che funzionasse. – Patrick

+0

Quindi è un bug in MSVS o gcc? –

+2

@LuchianGrigore Non ci sono errori, lo snippet compila. Il linker non riesce a trovare la definizione di 'NS :: Y'. Ci sono diversi passaggi quando si costruisce un eseguibile. –

Problemi correlati