Considere este ejemplo he encontrado en el sitio web de IBM:GCC, Clang e IBM no están de acuerdo en cómo realizar la búsqueda de nombre dependiente del parámetro de plantilla. ¿Cuál es la correcta?
#include <iostream>
using namespace std;
void f(double) { cout << "Function f(double)" << endl; }
template<class T> void g(T a) {
f(123);
h(a);
}
void f(int) { cout << "Function f(int)" << endl; }
void h(double) { cout << "Function h(double)" << endl; }
void i() {
extern void h(int);
g<int>(234);
}
void h(int) { cout << "Function h(int)" << endl; }
int main(void) {
i();
}
¿Qué va a imprimir?
La documentación de IBM Adapté este ejemplo de, disponible here, dice que va a imprimir:
Function f(double) Function h(double)
La razón de esto es que el nombre de plantilla de parámetros dependientes de las operaciones de búsqueda se lleva a cabo justo antes de la creación de instancias de
i()
, por lo que encuentrah(double)
pero noh(int)
.Cuando compilo usando GCC 4.4.1, imprime:
Function f(double) Function h(int)
GCC parece estar mirando hacia arriba los nombres de los parámetros de plantilla-dependiente en la plantilla después de todo lo demás ha sido compilado, por lo que encuentra ambos
h(double)
yh(int)
, y prefiere este último.Cuando lo compilo con Clang 2.8, no se puede compilar. El error del compilador es:
ibm_example.cc:8:3: error: use of undeclared identifier 'h' h(a); ^ ibm_example.cc:16:3: note: in instantiation of function template specialization 'g<int>' requested here g<int>(234); ^ 1 error generated.
Clang parece estar mirando hacia arriba los nombres de los parámetros de plantilla-dependiente en la plantilla en el punto donde se declara la plantilla, por lo que no se encuentra ni
h(double)
h(int)
.
¿Cuál es la correcta?
posible duplicado de [? ¿Cuáles son las reglas para la elección de las funciones de plantilla sobrecargados] (http://stackoverflow.com/questions/1177739/what-are -the-rules-for-choosing-from-overloaded-template-functions) –
Sin cambios para GCC 4.5.1 FWIW. – ergosys
@Foo: Definitivamente no es un duplicado de esa pregunta, se trata de la resolución de sobrecarga, esta es sobre el alcance y qué símbolos son visibles en el momento de la definición. – ildjarn