2012-03-22 15 views
5

El siguiente código se compila correctamente con Visual Studio 2010:código se compila en Visual Studio 2010, pero no se debe compilar en absoluto

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

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

(este código se reduce en donde se han sustituido todos mis propios nombres de las clases y funciones por X, Y, ...)

Me esperaba que la línea Y(x) no compilaría, ya que debería ser NS::Y(x).

Este código fuente se compila con el siguiente comando

cl /c file.cpp 

no hay otros archivos incluidos aquí, no hay otras opciones de línea de comandos.

¿Por qué compila este archivo? Error en VS2010? ¿O algo que yo (y mis otros 3 colegas) pasamos por alto?

+1

intenté esto con g ++ y obtuve la referencia 'undefined a NS :: Y (NS :: X) '' - así que tal vez podría ser un error en VS .. – WeaselFox

+2

http://ideone.com/WzC6V –

+0

@WeaselFox : completamente sin relación. Su error es un * error de enlazador * porque 'NS :: Y' no está definido. Es típico, y probablemente se definiría en otro archivo en una configuración completa. –

Respuesta

9

Lo que está experimentando se debe a ADL (Argument Dependent Lookup).

No hay nada de malo en su fragmento (además del hecho de que el enlazador probablemente se quejará de que NS::Y no está definido), pero debería compilarse - VS2012 está manejando el fragmento como debería.

El compilador encontrará NS::Y debido a que el tipo de parámetro x (NS::X) está en el ámbito adecuado.


3.4.2Argumento dependiente de búsqueda de nombre [basic.lookup.argdep]

  1. Cuando un nombre no se utiliza como el postfix-expresión en una llamada de función (5.2.2), se pueden buscar otros espacios de nombres no considerados durante la búsqueda no cualificada habitual (3.4.1), y en aquellos espacios de nombres, declaraciones de funciones de amigo de espacio de nombres de nombres (11.4) no que de lo contrario serán visibles.

    Estas modificaciones en la búsqueda dependen de los tipos de los argumentos (y para los argumentos de plantilla de plantilla, el espacio de nombres del argumento de plantilla ).

  2. Para cada argumento tipo T en la llamada a la función, hay un conjunto de cero o más espacios de nombres asociados y un conjunto de cero o más clases asociadas a considerar.

    Los conjuntos de espacios de nombres y las clases están determinados por completo por los tipos de los argumentos de función (y el espacio de nombres de cualquier argumento de plantilla de plantilla).

+0

Tienes razón, yo también lo encontré en Wikipedia. Difícil. No esperaba que esto funcionara. – Patrick

+0

Entonces, ¿es un error en MSVS o gcc? –

+2

@LuchianGrigore No hay ningún error, el fragmento compila. El vinculador simplemente no puede encontrar la definición de 'NS :: Y'. Hay varios pasos al construir un ejecutable. –

Cuestiones relacionadas