2012-09-05 11 views
7

¿Cómo funciona esto? ¿Está relacionado con ADL?Búsqueda dependiente del argumento en C++

#include <iostream> 

template <typename T> 
struct A 
{ 
    friend void f(T x) 
    { 
     std::cout << "A\n"; 
    } 
}; 

int main() 
{ 
    f(new A<void*>()); 
} 

Puede alguien decirme por qué no puedo usar algo como

f(A<int>()); 
+0

Tener la palabra 'friend' en una definición no es correcta IIRC. – chris

+0

@chris: No, está bien. –

+0

@JesseGood, Ah, lo encontré. Debo estar pensando en otra cosa. Recuerdo que algo así tenía una declaración descaradamente obvia en el estándar en contra de eso. – chris

Respuesta

13
f(new A<void*>());  

funciona De hecho, debido a Argument dependent lookup/Koenig lookup (ADL)
estados búsqueda Koenig :

No es necesario que califique el espacio de nombre (ámbito) para las funciones si uno o más tipos de argumentos están definidos en el espacio de nombres de la función.

considerar un simplistic example no utilizando plantillas y debe ayudar a entender ADL en el trabajo mejor:

#include <iostream> 
struct A 
{ 
    friend void f(A x) 
    { 
     std::cout << "A\n"; 
    } 
}; 

int main() 
{ 
    f(A()); 
    return 0; 
} 

Salida:

A 

Cuando se utiliza f(A<int>()), Establece que f() requiere un argumento del tipo int, pero su estructura no proporciona ninguna conversión de A a int y de ahí el error.

If you provide the appropriate conversion then it will work as well. Something like:

operator int(){return 1;} 
+0

¿Por qué no puedo usar f (A ());? – FrozenHeart

+0

No entiendo qué tiene esto que ver con ADL. ¿Cómo podría calificar el espacio de nombres? – 0x499602D2

Cuestiones relacionadas