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;}
Tener la palabra 'friend' en una definición no es correcta IIRC. – chris
@chris: No, está bien. –
@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