Tengo un código C++ que ya no se está compilando sin la opción -permissive. Es un código de propiedad que no puedo compartir, pero creo que he podido extraer un caso de prueba simple que demuestra el problema. Aquí está la salida desde g ++Búsqueda de nombres en plantillas C++
template_eg.cpp: In instantiation of 'void Special_List<T>::do_other_stuff(T*) [with T = int]':
template_eg.cpp:27:35: required from here
template_eg.cpp:18:25: error: 'next' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
template_eg.cpp:18:25: note: declarations in dependent base 'List<int>' are not found by unqualified lookup
template_eg.cpp:18:25: note: use 'this->next' instead
Así que aquí está el código de la genera el problema:
template<class T> class List
{
public:
void next(T*){
cout<<"Doing some stuff"<<endl;
}
};
template<class T> class Special_List: public List<T>
{
public:
void do_other_stuff(T* item){
next(item);
}
};
int main(int argc, char *argv[])
{
Special_List<int> b;
int test_int = 3;
b.do_other_stuff(&test_int);
}
No estoy tratando de averiguar cómo solucionar el código para que se compile de nuevo. Eso es simplemente una cuestión de cambiar el siguiente (artículo) a este-> siguiente (artículo) Estoy tratando de comprender mejor por qué este cambio es necesario. Encontré una explicación en esta página: http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html Si bien esa explicación fue útil, todavía tengo algunas preguntas. ¿No debería el hecho de que mi función tome una T * (puntero a tipo T) hacerlo dependiente del argumento de la plantilla. En mi propia redacción, ¿no debería el compilador (gcc 4.7) ser capaz de descubrir que la función next() está en la lista de la clase base? ¿Por qué es necesario anteponer esto-> frente a cada llamada? Me he dado cuenta de que clang 3.1 muestra el mismo comportamiento, por lo que supongo que hay algún requisito en el estándar de C++ que requiere este comportamiento. ¿Alguien podría proporcionar una justificación para ello?
+1. Breve y concisa explicación. – Nawaz
¡Gracias! Entonces, si entiendo correctamente, los argumentos a continuación no son relevantes. El hecho de que next() tome un argumento dependiente, ¿no hace que next() sea dependiente? – Avatar33
@ Avatar33: 'next()' es dependiente, pero la búsqueda de la segunda fase solo agregará resultados de ADL, que no incluyen miembros de la base. Quizás deba volver a visitar la forma de la respuesta ... –